假设我有一个线程,应该定期执行某个任务,但这个周期是每小时6次12次(每5分钟一次)。我经常看到代码使用一个is_running标志来控制线程循环,在每个循环中检查它,就像这样:
std::atomic<bool> is_running;
void start()
{
is_running.store(true);
std::thread { thread_function }.detach();
}
void stop()
{
is_running.store(false);
}
void thread_function()
{
using namespace std::literals;
while (is_running.load())
{
// do some task...
std::this_thread::sleep_for(5min);
}
}
但是,如果调用stop()
函数,在start()
之后1毫秒,线程将在等待299999毫秒后被唤醒并检查标志,然后结束。
我的理解正确吗?如何避免让本应该结束的线程保持活动状态(但处于休眠状态)?我目前的最佳方法如下:
void thread_function()
{
using namespace std::literals;
while (is_running.load())
{
// do some task...
for (unsigned int b = 0u, e = 1500u; is_running.load() && (b != e); ++b)
{
// 1500 * 200 = 300000ms = 5min
std::this_thread::sleep_for(200ms);
}
}
}
有没有一种不那么麻烦且更直接的方法来实现这个目标?