Page 124 - 4868
P. 124
Ошибка! Стиль не определен. 122
}
/* помістити в буфер даних числа 1, ..., numIters */
void* Producer(void* arg) {
int produced;
for (produced = 1; produced <= numIters; produced++) {
sem_wait(&empty);
data = produced;
sem_post(&full);
}
}
/* витягти 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);
Даний код виконує ініціалізацію м’ютекса з атрибутами по
замовчуванню. Критична секція коду, що використовує м’ютекс, в даному
випадку виглядає наступним чином: