Что такое точка отмены?
Я пытаюсь понять, что такое точка отмены в c++. Я прочел:
man page и какие точки отмены pthread используются для
но я все еще немного смущен по некоторым пунктам. Например, я использую функцию file write (). Очевидно, это точка отмены. Поэтому, когда я вызываю write (), я вижу, что другой поток может начать обработку (поэтому мой код переключается с потока записи на другой поток), это обычно происходит, когда буфер записи заполнен и должен быть опорожнен до того, как write() сможет успешно/завершить.
но на мой взгляд, это не отмена потока,а просто временная блокировка / приостановка, и нет никакой "очистки" потока...
Итак, мой вопрос в том, имеют ли точки отмены отношение к "точкам блокировки"? - это действительно одно и то же, или есть какая-то разница? Любое четкое описание "верхнего уровня" того, что точка отмены будет очень полезной.
2 ответов
когда ваш поток вытягивается из выполнения, его состояние сохраняется ОС, и это не является отменой потока. Отмена означает прекращение потока, по запросу, с конкретным намерением позволить всему в конечном состоянии после завершения (ака. все ресурсы освобождаются, всех обработчиков обновления и т. д.).
то, что вы называете блокировкой, может произойти с потоком в середине отмены.
пример: поток получает запрос на отмену. Очереди ОС это до тех пор, пока поток не станет отменяемым. Когда поток становится отменяемым, и поток выполняет точку отмены, поток можно очистить и отменить. The написать функция является точкой отмены, это означает, что с точки зрения ОС безопасно отменить поток во время выполнения этой функции (Состояние всех связанных ресурсов будет согласованным).
пока процедура отмены выполняется, поток может быть заблокирован столько раз, сколько ОС, кажется, подходит.
в качестве дополнительного Примечания, если вы посмотрите на требование POSIX для точек отмены, практически все блокирующие интерфейсы должны быть точками отмены. В противном случае на любом полностью заблокированном потоке (в таком вызове) не было бы безопасного способа завершить этот поток.
когда вы хотите завершить или отменить поток из другого потока (например, из основного потока), используя pthread_cancel()
происходит следующее (Си.Ф.):
на
pthread_cancel()
функция отправляет запрос на отмену в поток нить.
целевой поток не завершится сразу, а скорее, когда он достигнет точка отмены (Си.Ф.):
POSIX.1 указывает, что некоторые функции должны, и некоторые другие функции могут быть точками отмены. Если поток сократима, его тип cancelability откладывается, и запрос на отмену ожидание потока, затем поток отменяется, когда он вызывает функция, которая является точкой отмены.
могут ли эти функции, являющиеся точкой отмены, также блокировать выполнение потока, на данный момент не имеет значения. Список этих функций приведен в документации:
обратите внимание, что есть настройки, которые могут влиять на поведение и "отменяемость" потока, который я оставил здесь для простоты. Для дальнейшего чтение: