Когда используется pthread_cancel
а не pthread_kill
?
Когда использовать pthread_cancel, а не pthread_kill?
Ответ 1
Я бы не использовал ни один из этих двух, а только личные предпочтения.
Из двух, pthread_cancel
является самым безопасным для завершения потока, поскольку поток должен быть затронут только тогда, когда он установил его условие отмены для истины, используя pthread_setcancelstate()
.
Другими словами, он не должен исчезать при хранении ресурсов таким образом, который может вызвать тупик. Вызов pthread_kill()
посылает сигнал конкретному потоку, и это способ асинхронно влиять на поток по причинам, отличным от отмены.
Большинство моих потоков имеют тенденцию быть в циклах, которые все равно выполняют работу и периодически проверяют флаги, чтобы увидеть, должны ли они выйти. Это в основном потому, что я вырос в мире, когда pthread_kill()
был опасным, а pthread_cancel()
не существовало.
Я соглашаюсь с теорией о том, что каждый поток должен полностью контролировать свои собственные ресурсы, включая время его выполнения. Я всегда находил, что это лучший способ избежать тупика. С этой целью я просто использую мьютексы для связи между потоками (я редко нашел необходимость в истинном асинхронном сообщении) и переменную флага для завершения.
Ответ 2
Вы не можете "убить" поток с помощью pthread_kill()
. Если вы попытаетесь отправить SIGTERM
или SIGKILL
в поток с помощью pthread_kill()
, он завершит весь процесс.
Я согласен с теорией, что ПРОГРАММАТОР, а не НИТИ (ни разработчики API) должны полностью контролировать свое собственное программное обеспечение во всех аспектах, включая то, какие потоки отменяют какие.
Однажды я работал в фирме, где мы разработали сервер, который использовал пул рабочих потоков и один специальный главный поток, который отвечал за создание, приостановку, возобновление и завершение рабочих потоков в любое время, когда он этого хотел. Конечно, потоки использовали какую-то синхронизацию, но это был наш дизайн, а не какие-то догмы с применением API. Система работала очень хорошо и эффективно!
Это было под Windows. Затем я попытался перенести его на Linux и наткнулся на глупые "теории" pthreads о том, как неправильно приостанавливать другой поток и т.д. Поэтому мне пришлось отказаться от pthreads и напрямую использовать системные системные вызовы Linux (clone()
) для реализовать потоки для нашего сервера.