Когда используется pthread_cancel
, а не pthread_kill
?
Я бы не использовал ни один из этих двух, но это просто личные предпочтения.
Из двух, pthread_cancel
является наиболее безопасным для завершения потока, поскольку предполагается, что поток будет затронут только тогда, когда он установит для своего состояния отмены значение true с помощью pthread_setcancelstate ()
.
Другими словами, он не должен исчезать, удерживая ресурсы таким образом, чтобы это могло вызвать тупик. Вызов pthread_kill ()
отправляет сигнал определенному потоку, и это способ асинхронно воздействовать на поток по причинам, отличным от его отмены.
Большинство моих потоков все равно находятся в циклах, выполняя работу и периодически проверяя флаги, чтобы увидеть, следует ли им выйти. В основном потому, что я вырос в мире, когда pthread_kill ()
был опасен, а pthread_cancel ()
не существовал.
Я поддерживаю теорию, согласно которой каждый поток должен полностью контролировать свои собственные ресурсы, включая время выполнения. Я всегда считал, что это лучший способ избежать тупика. С этой целью я просто использую мьютексы для связи между потоками (я редко обнаруживал необходимость в истинной асинхронной связи) и переменную флага для завершения.