Repository navigation
condition variable
serhij.zolotukhin edited this page Dec 7, 2025
·
1 revision
примитив синхронизации, обеспечивающий блокирование одного или нескольких потоков
до момента поступления сигнала от другого потока о выполнении некоторого условия
или до истечения максимального промежутка времени ожидания.
Условные переменные используются вместе с ассоциированным мьютексом и являются элементом некоторых видов мониторов.
Чтобы избегать состояния активного ожидания, процессы должны сигнализировать друг другу об ожидаемых событиях.
A condition variable enables you to implement
a condition under which a thread executes and,
the condition under which the thread is blocked.
Условные переменные позволяют потока ожидать наступления некоторого события
Условные переменные используются, чтобы атомарно блокировать потоки, пока не наступит специфическое состояние.
Состояние проверяется под защитой мьютекса.
Если условие ложно, поток обычно блокируется на переменной состояния и атомарно освобожает мьютекс, ожидающий изменения состояния.
pthread_mutex_lock(&request_lock);
while (length == 0)
pthread_cond_wait(&request_consumer, &requests_lock);
Если другой поток изменяет состояние, он сигнализирует связанной переменной о том,
что нужно пробудить один или несколько ожидающих потоков,
снова захватить мьютекс и перепроверить условие.
pthread_mutex_unlock(&request_lock);
pthread_cond_signal(&request_producer);
#include <pthread.h>
// создания условной переменной используется функция
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
// При вызове wait мутекс должен быть захвачен, в противном случае результат не определен
// Эта функция блокируется, пока не придет сообщение о нужном состоянии.
// Она атомарно освобождает связанный с ней закрытый мьютекс перед блокированием,
// и атомарно захватывает его снова, перед возвратом.
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
// разблокирует как минимум один поток, заблокированный переменной cond
int pthread_cond_signal(pthread_cond_t *cond);
My footer
My side bar