POSIX определяет два типа для типа отмены потока: PTHREAD_CANCEL_ASYNCHRONOUS
и PTHREAD_CANCEL_DEFERRED
(устанавливается pthread_setcanceltype(3)
), определяя, когда pthread_cancel(3)
должен вступить в силу. Насколько я читал, страницы руководства POSIX мало что говорят об этом, но страница руководства Linux говорит следующее о PTHREAD_CANCEL_ASYNCHRONOUS
:
Тему можно отменить в любой момент. (Как правило, он будет отменен сразу после получения запроса на отмену, но система не гарантирует этого.)
Мне любопытно, что означает система не гарантирует этого. Я легко могу представить, как это происходит в многоядерных/многопроцессорных системах (до переключения контекста). А как насчет одноядерных систем:
- Можем ли мы, чтобы поток не был отменен немедленно, когда запрашивается отмена, и отмена включена (
pthread_setcancelstate(3)
), а тип отмены установлен наPTHREAD_CANCEL_ASYNCHRONOUS
? - Если да, то при каких условиях это могло произойти?
Меня в основном интересует Linux (LinuxThreads / NPTL), но также и более общий способ просмотра этого бизнеса отмены, совместимый со стандартом POSIX.
Обновление/пояснение: здесь реальной практической проблемой является использование ресурсов, которые уничтожаются сразу после вызова pthread_cancel()
, когда для целевого потока включена отмена и установлен тип PTHREAD_CANCEL_ASYNCHRONOUS
!!! Итак, дело в следующем: есть ли хоть малейшая возможность для отмененного потока в этом случае продолжать нормально работать после переключения контекста (даже в течение очень короткого времени)?
Спасибо за ответ Дэймона, вопрос о доставке и обработке сигнала сводится к следующему переключению контекста.
Обновление-2: я ответил на свой собственный вопрос, указав, что это серьезная проблема и что базовая структура программы должна рассматриваться на принципиально другом концептуальном уровне. Я хочу, чтобы этот «неправильный» вопрос был полезен для других, интересующихся тайнами асинхронной отмены.