Sys*_*dev 8 c++ multithreading timer c++11
我正在尝试使用经典方法实现基本计时器:start()和stop().我正在使用带有std :: thread和std :: chrono的c ++ 11.
我创建并启动了一个显示"Hello!"的Timer对象.每一秒,然后与其他线程我试图停止计时器,但我不能.计时器永不停止.
我认为问题在于th.join()[*]在线程完成之前停止执行,但是当我删除th.join()行时,程序显然在计时器开始计数之前完成.
所以,我的问题是如何在不停止其他线程的情况下运行线程?
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
class Timer
{
thread th;
bool running = false;
public:
typedef std::chrono::milliseconds Interval;
typedef std::function<void(void)> Timeout;
void start(const Interval &interval,
const Timeout &timeout)
{
running = true;
th = thread([=]()
{
while (running == true) {
this_thread::sleep_for(interval);
timeout();
}
});
// [*]
th.join();
}
void stop()
{
running = false;
}
};
int main(void)
{
Timer tHello;
tHello.start(chrono::milliseconds(1000),
[]()
{
cout << "Hello!" << endl;
});
thread th([&]()
{
this_thread::sleep_for(chrono::seconds(2));
tHello.stop();
});
th.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Hello!
Hello!
...
...
...
Hello!
Run Code Online (Sandbox Code Playgroud)
在Timer::start你创建一个新的线程th,然后立即join将其与th.join().实际上,start在生成的线程退出之前不会返回.当然,它永远不会退出,因为在start返回之前没有任何东西会设置为false .
在join你打算等待它完成之前不要一个线程.在这种情况下,在stop设置之后running = false可能是正确的地方.
另外 - 尽管它不是不正确的 - 没有必要再main调用另一个线程this_thread::sleep_for.您可以使用主线程执行此操作:
int main()
{
Timer tHello;
tHello.start(chrono::milliseconds(1000), []{
cout << "Hello!" << endl;
});
this_thread::sleep_for(chrono::seconds(2));
tHello.stop();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21377 次 |
| 最近记录: |