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