Составители:
23
блокировки – это надстройка над механизмом условных переменных. Для
применения ждущих блокировок необходимо выполнить несколько опера-
ций. Системные вызовы, обслуживающие этот механизм синхронизации,
представлены в табл. 2.3.
Таблица 2.3
Функция Описание
pthread_sleepon_lock() Установить механизм синхронизации
pthread_sleepon_unlock() Снять механизм синхронизации
pthread_sleepon_broadcast() Деблокировка всех потоков, ожидающих событие
pthread_sleepon_signal() Деблокировка наиболее приоритетного потока, ожидающего
событие
pthread_sleepon_wait() Блокировать поток на ожидании события
Прежде всего поток, которому требуется ресурс, должен проверить,
надо ли ему ждать. С этой целью он должен проконтролировать некоторый
флаг готовности ресурса, и если ресурс доступен, то при его использовании
сбросить флаг готовности. Но такие проверки и модификации могут быть
одновременно от нескольких потоков, поэтому понадобится некоторая
форма монопольного доступа к флагу, чтобы в любой момент времени он
был доступен только одному потоку.
Метод, который применяется в данном случае, – это мьютекс, но это
внутренний мьютекс библиотеки ждущих блокировок, так что обращаться к
нему можно только с помощью двух функций: pthread_sleepon_lock() и
pthread_sleepon_unlock(). В примере 3 флагом доступа является перемен-
ная data_ready. В примере определено 2 потока: Consume («потребитель»)
и Producer («производитель»). Поток Consumer выполняет установку и
снятие ждущей блокировки. Это означает, что потребитель может теперь
надежно проверять и модифицировать флаг data_ready, не опасаясь гонок.
Пример из спортивной жизни с механизмом ждущих блокировок транс-
формируется так, что остается один представитель болельщиков на весь
стадион, а число работающих входов динамически изменяется: увеличива-
ется – по настоянию болельщиков или уменьшается – по желанию админи-
страции.
ПРИМЕР 3
Consumer () // поток-потребитель
{
while (1) {
pthread_sleepon_lock();
while (!data_ready) { /* разрешить проверку наличия события, если data_ready=0 */
pthread_sleepon_wait((&data_ready); // ждать событие
}
// обработать данные
data_ready=0;
pthread_sleepon_unlock();
Страницы
- « первая
- ‹ предыдущая
- …
- 21
- 22
- 23
- 24
- 25
- …
- следующая ›
- последняя »
