Page 123 - 4868
P. 123

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

               допомогою семафорів може мати наступний вигляд.

                     sem_wait(&mutex); /* P(mutex) */
                       критична секція;
                     sem_post(&mutex); /* V(mutex) */
                     Крім  того,  в  бібліотеці  Pthreads  визначені  функції  для  умовного
               очікування  на  семафорі,  отримання  поточного  значення  семафора  і  його
               знищення.
                     У  лістингу  2.1  наведено  приклад  рішення  задачі  типу  «виробник-
               споживач»  з  використанням  бібліотеки  Pthreads.  Функції  Producer  та

               Consumer  виконуються  як  незалежні  потоки.  Вони  розділяють  доступ  до
               буферу data. Функція Producer поміщає в буфер послідовність цілих чисел
               від  1  до  значення  numIters,  а  функція  Consumer  витягує  і  сумує  їх.  Для
               забезпечення спільного доступу до буфера для процесу-виробника і процесу-
               споживача використаємо два семафора з назвами empty та full.
                     Функція  main  ініціалізує  дескриптори  і  семафори,  та  створює  два
               потоки  і  очікує  завершення  їх  роботи.  Під  час  свого  завершення  потоки
               неявно викликають функцію pthread_exit. Оскільки аргументи потокам не
               передаються,  то  в  функції  pthread_create  в  ролі  значення  адресу
               передається NULL.

                     Лістинг  2.1  –  Розв’язок  задачі  типу  «виробник-споживач»  з
               використанням бібліотеки Pthreads

                     #include <pthread.h>
                     #include <semaphore.h>
                     #include <stdio.h>
                     #define SHARED 1

                     void* Producer(void*);    /* два потоки */
                     void* Consumer(void*);
                     sem_t empty, full;                  /* глобальні семафори */
                     int data;                           /* спільний буфер */
                     int numIters;
                     /* main() - зчитати командний рядок і створити потоки */
                     int main(int argc, char* argv[]) {
                       pthread_t pid, cid;   /*                  потік та атрибути */
                       pthread_attr_t attr;  /*                  дескриптори */
                       pthread_attr_init(&attr);
                       pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
                       sem_init(&empty, SHARED, 1); /* sem empty = 1 */
                       sem_init(&full, SHARED, 0);  /* sem full = 0 */
                       numIters = atoi(argv[1]);
                       pthread_create(&pid, &attr, Producer, NULL);
                       pthread_create(&cid, &attr, Consumer, NULL);
                       pthread_join(pid, NULL);
                       pthread_join(cid, NULL);
   118   119   120   121   122   123   124   125   126   127   128