【发布时间】:2015-03-05 17:00:59
【问题描述】:
我已经制作了一个非常简单的线程计时器类,并且考虑到 MT 代码存在的缺陷,我想要进行健全性检查。这里的想法是启动一个线程,然后不断循环等待一个变量。如果等待超时,则超过了间隔,我们调用回调。如果变量被发出信号,线程应该退出并且我们不调用回调。
我不确定的一件事是我的代码在析构函数中会发生什么,因为线程可能在那里(只是)可连接。我可以在析构函数中加入线程以确保它完成吗?
课程如下:
class TimerThreaded
{
public:
TimerThreaded() {}
~TimerThreaded()
{
if (MyThread.joinable())
Stop();
}
void Start(std::chrono::milliseconds const & interval, std::function<void(void)> const & callback)
{
if (MyThread.joinable())
Stop();
MyThread = std::thread([=]()
{
for (;;)
{
auto locked = std::unique_lock<std::mutex>(MyMutex);
auto result = MyTerminate.wait_for(locked, interval);
if (result == std::cv_status::timeout)
callback();
else
return;
}
});
}
void Stop()
{
MyTerminate.notify_all();
}
private:
std::thread MyThread;
std::mutex MyMutex;
std::condition_variable MyTerminate;
};
我想一个更好的问题可能是请某人将我指向一个非常简单的线程计时器,如果某处已经有一个可用的计时器。
【问题讨论】:
标签: c++ multithreading timer