Предположим, что у меня есть поток, который должен выполнять некоторую задачу периодически, но этот период 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()
, скажем, 1 миллисекунда после start()
, поток будет живым для 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);
}
}
}
Есть ли более грязный и более простой способ достичь этого?