if (ex) (*_cleanup_handler.rtn) (_cleanup_handler.arg);
}
Возможна даже более «смелая» реализация этих функций, которая позволит компилятору «считать» обработчик запроса на отмену константой, значение которой можно «встраивать» в код. В данном томе стандарта IEEE Std 1003.1-2001 пока оставлен неопределенным результат вызова функции longjmp () из обработчика сигнала, выполняемого в функции библиотеки POSIX System Interfaces. Если в какой-то реализации потребуется разрешить этот вызов и придать ему надлежащее поведение, функция longjmp () должна в этом случае вызвать все обработчики запроса на отмену, которые были помещены в стек (но еще не извлечены из него) с момента вызова функции setjmp ().
Рассмотрим многопоточную функцию, вызываемую одним потоком, который использует сигналы. Если бы сигнал был выдан обработчику сигналов во время операции qsort(), и этому обработчику пришлось бы вызвать функцию longjmp() (которая в свою очередь не вызывала бы обработчики запроса на отмену), то вспомогательные потоки, создаваемые функцией qsort (), не были бы аннулированы. Они бы продолжали выполняться и осуществляли запись в массив аргументов даже в том случае, если этот массив был к тому времени извлечен из стека.
Обратите внимание на то, что такой механизм обработки запросов на отмену особенно тесно связан с языком С, и, несмотря на требование независимости языка, предъявляемое к любому унифицированному механизму выполнения «очистительно-восстановительных работ», подобный механизм, выраженный в других языках, может быть совершенно иным. Кроме того, необходимость этого механизма в действительности связана только с отсутствием реального механизма обработки исключительных ситуаций в языке С, который был бы идеальным решением.
Здесь отсутствуют замечания о функции безопасной отмены потока. Если приложение в своих обработчиках сигналов не имеет точек отмены, блокирует любой сигнал, обработчик которого может иметь точки отмены (несмотря на вызов асинхронно-опасных функций), или запрещает отмену (несмотря на вызов асинхронно-опасных функций), все функции можно безопасно вызывать из функций обработки запросов на отмену потоков.
Будущие направления
Отсутствуют.
Смотри также
pthread_cancel(), pthread_setcancelstate(), то
Последовательность внесения изменений
Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширение
Issue 6
Функции pthread_cleanup_pop() и pthread_cleanup_push() от
Добавлен раздел «За
Раздел «Описание» был отредактирован с целью исключить из него слово « must» («должен»).
pthread_cond_broadcast(),pthread_cond_signal()
Имя
pthread_cond_broadcast(),pthread_cond_signal()
Описание
Эти функции используются для разблокировки потоков, заблокированных с помощью переменной условия.
Функция pthread_cond_broadcast () позволяет разблокировать все потоки, заблокированные в данный момент с использованием переменной условия, заданной параметром
Функция 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 ().
Функции pthread_cond_broadcast () и pthread_cond_signal () могут быть вызваны потоком, владеющим (или нет) в данный момент мьютексом. При этом потоки, вызвавшие функцию pthread_cond_wait () или pthread_cond_timedwait (), связали во время ожидания этот мьютекс с условной переменной. Однако, если необходимо обеспечить прогнозируемое поведение, этот мьютекс может быть заблокирован потоком, вызвавшим функцию pthread_cond_broadcast () или pthread_cond_signal ().
Функции pthread_cond_broadcast() и pthread_cond_signal() не будут иметь результата, если в данный момент не су
Возвращаемые значения
При успешном завершении функции pthread_cond_broadcast () и pthread_ cond_signal () возвра
pthread_cond_broadcast, pthread_cond_signal — функции разблокировки потоков, заблокированных с по
Синопсис
THR
#include <pthread.h>
int pthread_cond_broadcast (pthread_cond_t
int pthread_cond_signal (pthread_cond_t
|Ошибки
Функции pthread_cond_broadcast () и pthread_cond_signal ()
[EINVALJ значение, заданное параметром cond, не ссылается на инициализированную условную переменную.
Эти функции не возвращают код ошибки [EINTR].
Примеры
Отсутствуют.
Замечания по использованию
Функция pthread_cond_broadcast () используется при изменении состояния общей переменной в ситуации, когда выполняется сразу несколько потоков. Рассмотрим задачу с участием одного «изготовителя» и нескольких «потребителей», в которой «изготовитель» может вставить в список несколько элементов, к которым могут получать доступ «потребители» (по одному элементу за раз). Путем вызова функции pthread_cond_broadcast() «изготовитель» уведомляет о своем действии всех «потребителей», которые, возможно, находятся в состоянии ожидания, и, таким образом, при использовании мультипроцессора приложение может достичь более высокой пропускной способности. Кроме того, функция pthread_cond_broadcast () позволяет упростить реализацию блокировки чтения-записи. Функция pthread_cond_broadcast () весьма полезна, когда записывающий поток освобождает блокировку, и нужно