(выполняет запись) | (выполняет чтение) | (выполняет запись) | (выполняет чтение) |
Нет | Нет | Нет | Да |
Нет | Нет | Да | Нет |
Нет | Да | Нет | Нет |
Нет | Да | Нет | Да |
Да | Нет | Нет | Нет |
Условные переменные
В листинге 4.6 поток-«потребитель» содержал цикл:
15 while(TextFiles.empty())
16 {}
Поток-«потребитель» выполнял итерации цикла до тех пор, пока в очереди TextFiles были элементы. Этот цикл можно заменить условной пере
Условная переменная имеет тип pthread_cond_t. Ниже перечислены типы операций, которые может она выполнять:
• инициализация;
• разрушение;
• ожидание;
• ожидание с ограничением по времени;
• адресная сигнализация;
• всеобщая сигнализация;
Операции инициализации и разрушения выполняются условными переменными подобно аналогичным операциям других мьютексов. Функции класса pthread_cond_t, которые реализуют эти операции, перечислены в табл. 5.7.
Ожидание | int pthread_cond_wait(pthread_cond_t * restrict cond, pthread_mutex_t *restrict mutex); | int pthread_cond_timedwait( pthread_cond_t * restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime); |
Сигнализация | int pthread_cond_signal(pthread_cond_t*cond); | int pthread_cond_broadcast( pthread_cond_t *cond); |
Разрушение | int pthread_cond_destroy(pthread_cond_t*cond); |