«правильный» способ остановить поток деамона от деструктора класса

прежде всего «правильно», потому что я полагаю, что люди скажут мне, что это плохая практика, чтобы запустить поток из класса. :) Поэтому мне интересно, какой лучший способ остановить бесконечный поток в деструкторе. Функция обертывания, которая вызывает потоки в try и throwing exception при отключении флага? Просто хороший старый int/enum? Хороший новый std :: atomic int? Что-то другое? Теперь я использую:

//in destructor I call terminate member func
void terminate()
{
    currentStatus=terminating;
    std::cout<<"trying to kill"<

И функция, с которой выполняется поток:

while (currentStatus==active)
{
//...
}
currentStatus=terminated;

currentStatus - это перечисление:

enum status{
    active,
    terminating,
    terminated
};
0

1 ответы

«Я полагаю, люди скажут мне, что это плохая практика, чтобы запускать поток из класса» - не я, во всяком случае. Если у вас есть язык OO, где еще вы его начинаете :)

Существует проблема с циклом yield (). Если поток, вызывающий деструктор, имеет более высокий приоритет, чем завершаемый поток, ваш дизайн может постоянно работать на однопроцессорной системе. Даже в многоядерной системе может быть долгая задержка. Лучше ждать от дескриптора потока или какого-либо события, которое завершающий поток устанавливает как последнее действие перед выходом. Это не только устраняет избегаемый цикл CPU-looping, но и уклоняется от любых проблем с кешированием с emum, которые могут потребовать явных барьеров.

Rgds, Мартин

1
добавлено