Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

C++ Kill thread

#cpp #многопоточность

В 11 стандарте C++ есть какие нибудь возможности убить/завершить поток?
Подобие такого:

ACE_OS::thr_exit();


или

boost thread interrupt.

    


Ответы

Ответ 1



Явной возможности убить поток (как я понимаю речь идет о std::thread) нет. В этом нет необходимости. Завершайте поток корректно посредством окончания работы его функции. Если у Вас так не получается, то, скорее всего, имеете не правильную архитектуру программы.

Ответ 2



Убийство потока приводит к неопределенному поведению, по этому в стандартной библиотеке такого нет. Interrupt из boost не убивает поток, а бросает исключение из wait-функций (мест где возможно прерывание). Впрочем в стандартной библиотеке такого нет. Используйте потоки из Boost, или пишите свой механизм interrupt.

Ответ 3



Вы не можете правильно убить поток так, чтобы при этом не пострадала программа. Например, поток может находится в середине какой-нибудь критической операции (сбрасывать данные на диск, или просто держать mutex, или находится в середине выделения памяти и модификации списка свободных блоков). Нет никакой возможности гарантировать, что программа после убийства потока будет в правильном состоянии. По этой причине стандарт и не разрешает вам убивать потоки. Ваши потоки должны сотрудничать. Например, они могут время от времени опрашивать флаг, который просит их корректно завершить работу. (Только не забудьте синхронизацию при доступе к разделяемой переменной!)

Ответ 4



Как уже сказали, в самом стандарте такого решения нет, но в стандарте есть решение, которое может помочь: std::thread::native_handle. Вот как можно убить поток в Windows: #include #include int main() { std::thread thr([] {while(true);}); TerminateThread(thr.native_handle(), 0); thr.join(); return 0; } Но это всё интересно лишь в академическом плане — потоки убивать нельзя(по крайней мере пока у Вас нет действительно серьёзного обоснования)

Комментариев нет:

Отправить комментарий