#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; } Но это всё интересно лишь в академическом плане — потоки убивать нельзя(по крайней мере пока у Вас нет действительно серьёзного обоснования)
Комментариев нет:
Отправить комментарий