Составители:
25
2.5. Ждущие блокировки в сравнении с условными переменными
Ждущие блокировки имеют одно основное преимущество в сравнении
с условными переменными. Предположим, что необходимо синхронизиро-
вать множество объектов. При использовании условных переменных с ка-
ждым объектом ассоциируется отдельная условная переменная, т. е. для М
объектов необходимо определить М условных переменных. При примене-
нии же ждущих блокировок соответствующие им условные переменные
создаются динамически по мере постановки потоков на ожидание, поэтому
в данном случае на M объектов и N блокированных потоков потребовалось
бы максимум N, а не М условных переменных. Однако условные перемен-
ные более универсальны, чем ждущие блокировки, поскольку:
1) ждущие блокировки в любом случае основаны на условных пере-
менных;
2) мьютексы ждущих блокировок скрыты в библиотеке.
Второй пункт имеет еще и практический смысл. Если мьютекс скрыт в
библиотеке, он может быть только один на процесс, независимо от числа
потоков в этом процессе или от количества переменных. Данный фактор
может стать сильно ограничивающим. Гораздо лучше применять несколько
мьютексов – по одному на каждый набор данных – и явно сопоставлять им
условные переменные по мере необходимости.
2.6. Барьеры
Барьер – это механизм синхронизации, который позволяет логически
интегрировать результаты работы нескольких потоков, заставляя их ждать
на определенной точке до тех пор, пока число заблокированных потоков не
достигнет установленного значения. Только после этого все потоки дебло-
кируются и могут продолжить свое исполнение. Таким образом, барьер –
это некоторое рандеву для потоков в определенной точке. Когда специфи-
цированный набор потоков достигнет барьера, все потоки деблокируются и
Thread 1
Thread 2
Thread 3
Barier
cnt=3
Thread 1
Thread 2
Thread 3
wait
wait
wait
Blocked Running
Рис. 2.3
Страницы
- « первая
- ‹ предыдущая
- …
- 23
- 24
- 25
- 26
- 27
- …
- следующая ›
- последняя »
