В ходе комментария к a recent question возник вопрос о том, в какой момент можно ожидать отмена запроса на поток pthreads с возможностью отмены PTHREAD_CANCEL_DEFERRED
. Ссылки на the standard и немного адвокатской деятельности. Я не очень беспокоюсь о том, ошибался ли я в своих комментариях по этому вопросу, но я хотел бы, чтобы быть уверенным, что я правильно понимаю положения POSIX.Что означает POSIX, что поток «приостановлен»?
Наиболее уместный раздел стандарта говорит
Всякий раз, когда нить разрешена и запрос на аннулирование был сделан с этой нитью в качестве цели, и поток затем вызывает любую функцию, которая является точкой отмены [...], запрос на отмену должен быть выполнен до возвращения функции. Если поток имеет возможность отмены, и запрос на отмену выполняется с потоком в качестве цели, в то время как поток приостанавливается в точке отмены, поток должен быть разбужен, и на запрос аннулирования будет действовать.
Что, однако, означает, что нить должна быть «приостановлена»? POSIX явно определяет термин для процессов, но не, насколько я могу определить, для потоков. С другой стороны, приостановка потоков документов POSIX относится к поведению нескольких функций, включая, помимо прочего, некоторые из тех, которые связаны с объектами синхронизации. Следует ли тогда заключить, что они служат коллективно как соответствующее определение термина?
И как это все имеет отношение к вопросу, породившей эту строку запроса, учитывая, что POSIX не определяет нити подвески как часть поведения read()
, fread()
, или любой из общего файла или потока функций ввода/вывода, если поток не успевает за счет блокировки ввода-вывода, означает ли это, что это «приостановлено» для целей отмены?
Стандарт IEEE 1003.1 (POSIX) явно утверждает, что он согласован со стандартом ISO/IEC 9899 (C). Стандарт C цитирует [ИСО/МЭК 2382 (Словарь по информационным технологиям)] (https://www.iso.org/obp/ui/#iso:std:iso-iec:2382:ed-1:v1:en) для его жаргон. К сожалению, даже ISO/IEC 2382 не определяет _suspended_ и даже использует это слово в некоторых определениях. Из этого я заключаю, что «приостановлено» считается ключевым английским словом, подходящим для использования в объяснениях. Моя личная интерпретация приостановленного - это «состояние потока, в котором в настоящее время не используется процессорное время». –
@IwillnotexistIdonotexist, выравнивание с C - полезное наблюдение, спасибо. Тем не менее, я считаю, что «не используется время процессора» не вызывает беспокойства, поскольку похоже, что он будет охватывать потоки, которые * могут быть запущены, но были выгружены. Кажется, что это не соответствует действительности - все указывает на то, что потоковая приостановка - это состояние, в котором поток предотвращается *, даже если CPU был бы доступен для него. Возможно, действительно, что стандарты C и POSIX предполагают, что должна применяться естественная интерпретация, но детали имеют значение, и они неясны (для меня). –
Мне кажется естественным думать, что запущенные потоки, которые не работают, из-за отсутствия лучшего слова приостановлены.На сильно загруженном процессоре 'n'-core могут быть процессы'> n'_runnable_, но самое большее 'n' из них можно сделать _running_; Все остальные должны быть _not-running_, или как POSIX _might_ иметь его, «их исполнение приостановлено» в ожидании своей очереди. Как вы думаете? Является ли runnable thread ожидающим, пока квант времени текущего потока истекает? Как насчет того, что работающий поток, чей квант истекает и, хотя он все еще работает, отключается? Как насчет остановленных потоков? –