Подтвердить что ты не робот

Когда использовать pthread_cancel, а не pthread_kill?

Когда используется pthread_cancel а не pthread_kill?

4b9b3361

Ответ 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()) для реализовать потоки для нашего сервера.