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
   152   153   154   155   156   157   158   159   160   161   162