ПРИМЕЧАНИЕ
Пример ситуации, в которой требуется возобновление выполнения нескольких процессов, появится в главе 8, когда мы будем обсуждать задачу с несколькими считывающими и записывающими процессами. Когда записывающий процесс снимает блокировку, он должен разбудить все ждущие считывающие процессы, поскольку одновременное считывание в данном случае разрешено.
Альтернативным (и более безопасным) методом является использование широковещательной передачи во всех тех случаях, когда требуется использование сигналов. Сигнал является оптимизацией для тех случаев, когда известно, что все ожидающие процессы правильно написаны и требуется разбудить только один из них, и какой именно будет разбужен, значения не имеет. Во всех других ситуациях следует использовать широковещательную передачу.
#include
int pthread_cond_broadcast(pthread_cond_t
int pthread_cond_timedwait(pthread_cond_t
/* Функции возвращают 0 в случае успешного завершения, положительный код Еххх — в случае ошибки */
Функция pthread_cond_timedwait позволяет установить ограничение на время блокирования процесса. Аргумент
struct timespec {
time_t tv_sec; /* секунды */
long tv_nsec; /* наносекунды */
};
Эта структура задает конкретный момент системного времени, в который происходит возврат из функции, даже если сигнал по условной переменной еще не будет получен. В этом случае возвращается ошибка с кодом ETIMEDOUT.
Эта величина представляет собой абсолютное значение времени, а не промежуток. Аргумент
7.7. Атрибуты взаимных исключений и условных переменных
В наших примерах в этой главе мы хранили взаимные исключения и условные переменные как глобальные данные всего процесса, поскольку они использовались для синхронизации потоков внутри него. Инициализировали мы их с помощью двух констант: PTHREAD_MUTEX_INITIALIZER и PTHREAD_COND_INTIALIZER. Инициализируемые таким образом исключения и условные переменные приобретали значения атрибутов по умолчанию, но мы можем инициализировать их и с другими значениями атрибутов.
Прежде всего инициализировать и удалять взаимное исключение и условную переменную можно с помощью функций
#include
int pthread_mutex_imt(pthread_mutex_t *
int pthread_mutex_destroy(pthread_mutex_t *
int pthread_cond_init(pthread_cond_t *
int pthread_cond_destroy(pthread_cond_t *
/* Все четыре функции возвращают 0 в случае успешного завершения работы, положительное значение Еххх – в случае ошибки */