Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 405

Рассмотрим многопоточную функцию, вызываемую одним потоком, который использует сигналы. Если бы сигнал был выдан обработчику сигналов во время операции qsort(), и этому обработчику пришлось бы вызвать функцию longjmp() (которая в свою очередь не вызывала бы обработчики запроса на отмену), то вспомогательные потоки, создаваемые функцией qsort (), не были бы аннулированы. Они бы продолжали выполняться и осуществляли запись в массив аргументов даже в том случае, если этот массив был к тому времени извлечен из стека.

Обратите внимание на то, что такой механизм обработки запросов на отмену особенно тесно связан с языком С, и, несмотря на требование независимости языка, предъявляемое к любому унифицированному механизму выполнения «очистительно-восстановительных работ», подобный механизм, выраженный в других языках, может быть совершенно иным. Кроме того, необходимость этого механизма в действительности связана только с отсутствием реального механизма обработки исключительных ситуаций в языке С, который был бы идеальным решением.

Здесь отсутствуют замечания о функции безопасной отмены потока. Если приложение в своих обработчиках сигналов не имеет точек отмены, блокирует любой сигнал, обработчик которого может иметь точки отмены (несмотря на вызов асинхронно-опасных функций), или запрещает отмену (несмотря на вызов асинхронно-опасных функций), все функции можно безопасно вызывать из функций обработки запросов на отмену потоков.

Будущие направления

Отсутствуют.

Смотри также

pthread_cancel(), pthread_setcancelstate(), то м Base Definitions стандарта IEEEStd ЮОЗ.1-2001, .

Последовательность внесения изменений

Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширение м POSIX Threads Extension.

Issue 6

Функции pthread_cleanup_pop() и pthread_cleanup_push() от м ечены как часть опции Threads.

Добавлен раздел «За м ечания по использованию» (APPLICATION USAGE).

Раздел «Описание» был отредактирован с целью исключить из него слово « must» («должен»).

pthread_cond_broadcast(),pthread_cond_signal()

Имя

pthread_cond_broadcast(),pthread_cond_signal()

Описание

Эти функции используются для разблокировки потоков, заблокированных с помощью переменной условия.

Функция pthread_cond_broadcast () позволяет разблокировать все потоки, заблокированные в данный момент с использованием переменной условия, заданной параметром cond.

Функция pthread_cond_signal () используется для разблокировки по крайней мере одного из потоков, заблокированных с использованием условной переменной, заданной параметром cond (если таковые существуют). Если с использованием этой переменной условия заблокировано несколько потоков, то порядок разблокировки будет определен в соответствии с их стратегией планирования. Когда каждый поток, разблокированный в результате вызова функции pthread_cond_broadcast () или pthread_cond_signal(), вернется из вызванной им функции pthread_cond_wait () или pthread_cond_timedwait(), этот поток получит мьютекс, с которым была вызвана функция pthread_cond_wait() или pthread_cond_timedwait(). Разблокированные потоки будут состязаться за мьютекс в соответствии с их стратегией планирования (если это имеет смысл), как будто каждый из них вызвал функцию pthread_mutex_lock ().