«правильный» способ остановить поток deamon от деструктора класса - PullRequest
0 голосов
/ 28 октября 2011

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

//in destructor I call terminate member func
void terminate()
{
    currentStatus=terminating;
    std::cout<<"trying to kill"<<std::endl;
    while (currentStatus!=terminated)
        std::this_thread::yield();
    std::cout<<"MISSION ACOMPLISHED"<<std::endl;
}

И функция, выполняемая потоком:

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

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

enum status{
    active,
    terminating,
    terminated
};

1 Ответ

1 голос
/ 29 октября 2011

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

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

Rgds, Martin

...