pthread_cancel() и C++


С приходом в нашу жизнь реализации Linux тредов NPTL, стало доступно досрочное завершение тредов. Представьте себе ситуацию, когда у Вас есть треды с блокирующими системными вызовами или просто треды, использующие sleep() (что ещё хуже) и Вам вдруг понадобилось их завершить. В случае, если Вы программируете на С, скорей всего проблем не будет. Грабли начинают когда Вы решаете сделать тоже самое в C++.

Конечно, с ходу можно посоветывать переписать код и использовать неблокирующие системные вызовы в бесконечном цикле, с условием итерирования. А sleep() заменить на nanosleep() с обработкой EINTR. Но всегда есть абстрактная ситуация в вакууме, когда есть рабочий код и Вам придётся разбираться почему он падает после Ваших изменений.

Кроме того, принудительное завершение треда, может избавить Вас от необходимости контроля начавшейся итерации цикла, или даже, в теории отменить уже запущенный системный вызов, который использует переход в режим ядра (kernel mode).
Читать дальше

sleep() в C


Многие знают, что sleep() обладает плохой точностью. Многие так же знают, что sleep(), как и любой блокирующий системный вызов нужно вызывать в цикле, так как он попросту может не выждать требуемое от него количество времени.
Но в таком случае, после обработки сигнала, когда управляющий поток вернётся в место, где его прервали, sleep() будет вызван с теми же параметрами, что и первый раз.

Возможно, Вы думаете, что можно положиться на то, что sleep() возвращает время, которое ему нужно "доспать" и просто итерировать цикл, до тех пор, пока возвращаемое значение не будет равно 0. Давайте обратимся к документации библиотеки libc.
Читать дальше