Page 155 - 6571
P. 155

виробника  і  процесу-споживача  використаємо  два  семафора  з
            назвами empty та full.
                  Функція main ініціалізує дескриптори і семафори, та створює

            два  потоки  і  очікує  завершення  їх  роботи.  Під  час  свого
            завершення потоки неявно викликають функцію pthread_exit.
            Оскільки  аргументи  потокам  не  передаються,  то  в  функції
            pthread_create в ролі значення адресу передається NULL.


                  Лістинг  31  –  Розв’язок  задачі  типу  «виробник-споживач»
            з використанням бібліотеки 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);
                  }
                  /* помістити в буфер даних числа 1, ..., numIters */
                  void* Producer(void* arg) {
                    int produced;
                    for (produced = 1; produced <= numIters; produced++) {
                      sem_wait(&empty);

                      data = produced;
                      sem_post(&full);


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