Page 124 - 4868
P. 124

Ошибка! Стиль не определен.                                                              122

                     }
                     /* помістити в буфер даних числа 1, ..., numIters */
                     void* Producer(void* arg) {
                       int produced;
                       for (produced = 1; produced <= numIters; produced++) {
                         sem_wait(&empty);
                         data = produced;
                         sem_post(&full);
                       }
                     }
                     /* витягти numIters елементів з буфера і просумувати їх */
                     void* Consumer(void* arg) {
                       int total = 0, consumed;
                       for (consumed = 1; consumed <= numIters; consumed++) {
                         sem_wait(&full);
                         total = total + data;
                         sem_post(&empty);
                       }
                       printf("Сума дорівнює %d\n", total);
                     }

                     Бібліотека  Pthreads  також  підтримує  процедуру  блокування  та
               використання  умовних  змінних.  Блокування  можуть  використовуватися
               окремо для захисту критичних секцій або в комбінації з умовними змінними
               для  імітації  моніторів.  Нижче  подно  опис  функцій  бібліотеки  Pthreads  для
               реалізації  блокувань  та  умовних  змінних.  Заголовки  описаних  нижче  типів
               даних і функцій знаходяться у файлі pthread.h.


                     17.3. Блокування та умовні змінні
                     Блокування        в    бібліотеці      Pthreads     називаються        м’ютексними
               блокуваннями або просто м'ютексами, оскільки вони використовуються для
               реалізації процедури взаємного виключення. Основний код для оголошення
               та  ініціалізації  м’ютекса  за  своєю  структурою  аналогічний  коду  створення
               потоку.  Для  отримання  м’ютексних  примітивів  спочатку  необхідно
               оголосити  глобальні  змінні  для  дескриптора  м’ютекса  і  дескриптора
               атрибутів м’ютекса, після чого потрібно ініціалізувати самі дескриптори.
                     Якщо  м’ютексне  блокування  використовується  потоками  одного
               процесу,  але  не  використовується  потоками  інших  процесів,  то  перші  два

               кроки можна спростити до наступних рядків:
                     pthread_mutex_t mutex;
                     ...
                     pthread_mutex_init(&mutex, NULL);

                     Даний  код  виконує  ініціалізацію  м’ютекса  з  атрибутами  по
               замовчуванню.  Критична  секція  коду,  що  використовує  м’ютекс,  в  даному
               випадку виглядає наступним чином:
   119   120   121   122   123   124   125   126   127   128   129