Page 156 - 6571
P. 156

}
                        }
                        /* витягти 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);








                                                             155
   151   152   153   154   155   156   157   158   159   160   161