Page 157 - 6571
P. 157
Даний код виконує ініціалізацію м’ютекса з атрибутами по
замовчуванню. Критична секція коду, що використовує м’ютекс,
в даному випадку виглядає наступним чином:
pthread_mutex_lock(&mutex);
критична секція;
pthread_mutex_unlock(&mutex);
Розблокувати м’ютекс можна тільки з потоку, що утримує
блокування. Існує також і неблокуюча версія оператора lock.
Умовні змінні бібліотеки Pthreads, як і м’ютекси, характери-
зуються дескрипторами і атрибутами. Умовна змінна оголошу-
ється та ініціалізується атрибутами по замовчуванню як показано
нижче.
pthread_cond_t cond;
...
pthread_cond_init(&cond, NULL);
Основні операції над умовними змінними (очікування (wait),
сигналізація (signal) і сповіщення (broadcast)), аналогічні
оператору signal_all. Вони виконуються під час блокування
м’ютекса. Наприклад, процедура монітора при використанні
бібліотеки Pthreads імітується за допомогою блокування
м’ютекса на початку виклику процедури і зняття блокування в
кінці її виконання.
Параметрами процедури pthread_cond_wait виступає
умовна змінна і блокування м’ютекса. Потік, що переводиться в
режим очікування, спочатку повинен отримати блокування.
Нехай, наприклад, потік уже виконав виклик функції
pthread_mutex_lock(&mutex);
і після цього виконує виклик функції
pthread_cond_wait(&cond, &mutex);
У результаті таких дій потік звільняє mutex і очікує
встановлення відповідного значення для змінної cond. Коли
процес поновляє своє виконання після сигналізування або
оповіщення, то потік знову отримує контроль над м’ютексом і
блокує його. Якщо код
pthread_cond_signal(&cond);
156