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