Составители:
21
Каждый поток проверяет значение переменной condition. Мьютекс за-
хватывается активным потоком, прежде чем выполняется мониторинг усло-
вия condition. В результате гарантируется, что только поток, захвативший
мьютекс, имеет возможность проверить условие, логически связанное с
CONDVAR (cond). Если это условие истинно, то выполняется вызов
pthread_cond_wait(&cond, &mutex ) и текущий поток блокируется, а связан-
ный с ним мьютекс освобождается. Это дает возможность другому потоку
захватить мьютекс и изменять критическую переменную count. Текущий по-
ток будет блокирован до тех пор, пока другой поток не выполнит операцию
signal или broadcast для условной переменной cond. В этом случае мьютекс
вновь захватывается текущим потоком и освобождается только по вызову
pthread_mutex_unlock(&mutex ).
While-петля требуется по двум причинам. Во-первых, стандарт POSIX
не гарантирует от ложных пробуждений в мультипроцессорных системах.
Во-вторых, если другой поток изменил условие, то требуется отследить это
изменение в текущем потоке.
Любой поток, который выполняет операцию signal, будет деблокиро-
вать наиболее приоритетный поток, стоящий в очереди к условной пере-
менной. При выполнении любым потоком операции broadcast будут дебло-
кированы все потоки, стоящие в очереди к условной переменной. Связан-
ный мьютекс захватывается автоматически высокоприоритетным неблоки-
рованным потоком. Поток должен освободить мьютекс после обработки
критической секции. На рис. 2.2 показана мнемоническая схема функциони-
рования механизма синхронизации CONDVAR при выполнении операции
broadcast.
Thread 1
Thread 2
Thread 3
CONDVAR
Thread 1
Thread 2
Thread 3
wait
wait
wait
broadcast
Thread 4
Blocked Running
Рис. 2.2
Страницы
- « первая
- ‹ предыдущая
- …
- 19
- 20
- 21
- 22
- 23
- …
- следующая ›
- последняя »
