Остановка потоков длительного снаC++

Программы на C++. Форум разработчиков
Anonymous
Остановка потоков длительного сна

Сообщение Anonymous »

Предположим, у меня есть поток, который должен периодически выполнять какую-то задачу, но этот период составляет 6 раз в час 12 раз в час (каждые 5 минут). Я часто видел код, который управляет потоком. цикл с флагом is_running, который проверяется в каждом цикле, например:

Код: Выделить всё

std::atomic 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);
}
}
}
Есть ли менее грязный и более простой способ добиться этого?

Подробнее здесь: https://stackoverflow.com/questions/297 ... ep-threads

Вернуться в «C++»