Rich,
Я сталкивался с этим вопросом, когда делал обзор документации по безопасности для AC, над которой Алекс Олива работал над glibc.
По моему мнению, реализация библиотеки GNU C Library (на основе nptl) не сломан.Хотя верно то, что асинхронное аннулирование включено для блокировки системных вызовов (которые должны быть точками аннулирования), такое поведение все равно должно быть согласованным.
Также верно, что сигнал, полученный после того, как асинхронное аннулирование включено, приведет кобработчик сигнала, работающий с включенной асинхронной отменой.Также верно, что делать в этом обработчике что-либо, что также не является безопасным для асинхронного отмены, опасно.
Также верно, что если другой поток вызывает pthread_cancel с целевым потоком сигнала, то такая отмена будетдействовал немедленно.Это по-прежнему соответствует формулировке POSIX «до того, как функция вернется» (в этом случае чтение не вернулось, а целевой поток находится в обработчике сигнала).
Проблема с сигналом заключается в том, что он вызываетпоток должен находиться в двух одновременных состояниях, как постоянно в точке отмены, так и выполнять инструкции.Если поступает запрос на отмену, то, по моему мнению, он соответствует немедленно.Хотя группа Austin могла бы уточнить.
Проблема с реализацией glibc заключается в том, что для нее требуются все обработчики сигналов, выполняемые потоком, подлежащим отмене.вызывать только асинхронно-безопасные функции отмены.Это неочевидное требование, которое не вытекает из стандарта, но не делает его несовместимым.
Возможное решение для устранения хрупкости обработчиков сигналов:
Не включайте асинхронное аннулирование для блокировки системных вызовов, вместо этого включите новый бит IN_SYSCALL в реализации отмены.
Когда вызывается pthread_cancel и для целевого потока установлено IN_SYSCALL, тогдаотправьте SIGCANCEL в поток, как обычно, для async-cancel, но обработчик SIGCANCEL ничего не делает (кроме побочного эффекта прерывания системного вызова).
Обертка вокруг системных вызововбудет искать отмену, которая была отправлена, и отменяет поток, прежде чем вернется оболочка.
Хотя публикация этого в переполнении стека была забавной, я не знаю никого другого, кто читает это и можетответьте на ваш вопрос в деталях.
Я думаю, что дальнейшее обсуждение должно произойти на Остин Гроуp Список рассылки как часть обсуждения стандартов POSIX или должен происходить на libc-alpha как phart обсуждения реализации glibc.