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);