Я пытаюсь понять, что именно является точкой отмены в c ++. Я прочитал:
справочная страница а также Для чего используются точки отмены
Но я все еще немного запутался в некоторых моментах. Например, я использую функцию записи файла (). Видимо это точка отмены. Поэтому, когда я вызываю write (), я вижу, что другой поток может начать обработку (поэтому мой код переключается с потока записи на другой поток), это обычно происходит, когда буфер записи заполнен и его необходимо очистить перед записью. () может быть успешным / завершенным.
Но, на мой взгляд, это не отмена потока, а просто временная блокировка / приостановка, и нет никакой «очистки» потока, чтобы сделать …
Итак, мой вопрос, имеют ли точки отмены отношение к «точкам блокировки»? — это действительно одно и то же или есть какая-то разница?
Любое четкое описание «верхнего уровня» о том, что такое точка отмены, было бы действительно полезным.
Когда ваш поток извлекается из выполнения, его состояние сохраняется операционной системой, и это не отменяет поток. Отмена означает завершение потока, по запросу, с конкретным намерением перевести все в окончательное состояние после завершения (иначе все ресурсы освобождены, все обработчики обновлены и т. Д.).
То, что вы называете блокировкой, может произойти с потоком в середине отмены.
Пример: поток получает запрос на отмену. ОС ставит его в очередь, пока поток не станет отменяемым. Когда поток становится отменяемым, и поток выполняет точку отмены, поток может быть очищен и отменен. записывать Функция является точкой отмены, это означает, что с точки зрения ОС безопасно отменить поток, пока выполняется эта функция (состояние всех связанных ресурсов будет согласованным).
Пока выполняется процедура отмены, поток может быть заблокирован столько раз, сколько кажется подходящей ОС.
В качестве дополнительного примечания, если вы посмотрите на требование POSIX для точек отмены, фактически все блокирующие интерфейсы должны быть точками отмены. В противном случае в любом полностью заблокированном потоке (в таком вызове) не было бы безопасного способа завершить этот поток.
Когда вы хотите прекратить или отменить поток из другого потока (например, из основного потока), используя pthread_cancel()
происходит следующее (c.f.):
pthread_cancel()
функция отправляет запрос отмены в поток нить.
Целевой поток не завершится сразу, а скорее, когда он достигнет точка отмены (c.f.):
POSIX.1 определяет, что определенные функции должны, а некоторые другие
Функции могут быть точками отмены. Если поток отменяется,
его тип отменяемости откладывается, а запрос на отмену
в ожидании потока, затем поток отменяется, когда он вызывает
функция, которая является точкой отмены.
Независимо от того, могут ли эти функции, которые являются точкой отмены, также блокировать выполнение потока, на данном этапе не имеет значения. В документации есть список этих функций:
Обратите внимание, что есть настройки, которые могут влиять на поведение и «отменяемость» потока, которые я здесь оставил для простоты. Для дальнейшего чтения: