Я пытаюсь выполнить следующее упражнение:
Машина А производит предмет каждые 2 секунды. Машина АА собирает
изделие из 2-х предметов, произведенных машиной А.
Машина АА может собирать изделие каждую секунду, но для этого нужно 2
единиц товара, так что АА ждет 2 предмета от машины А.
Каждая машина работает в бесконечном цикле, но завод закрывается после 20
секунд и не ждет окончания работы машин.
Напишите программу, которая позволяет фабрике и машинам в ней,
организованная работа в соответствии с требованиями завода.
У меня есть следующий вывод, и мой код должен выводить то же самое.
Я пишу это:
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <semaphore.h>
sem_t sem1;
void* Machine_A() {
while(1) {
printf("Produced A\n");
sleep(2);
sem_post(&sem1);
}
}
void* Machine_AA() {
while(1) {
sem_wait(&sem1);
sem_wait(&sem1);
printf("Collected AA\n");
sleep(1);
}
}
int main() {
pthread_t threadA, threadAA;
sem_init(&sem1, 0, 0);
pthread_create(&threadA, NULL, Machine_A, NULL);
pthread_create(&threadAA, NULL, Machine_AA, NULL );
sleep(20);
return 0;
}
и я получаю этот вывод:
Я не понимаю, почему аппарат А печатает 3 раза в первый раз, и после этого он работает хорошо.
Если я изменю код машины A:
void* Machine_A() {
while(1) {
printf("Produced A\n");
sem_post(&sem1);
sleep(2);
}
}
Я получаю правильный вывод.
Я не понимаю, почему он печатает Produced A
3 раза.
Каждый раз sem_wait
блокируется, пока не станет возможным выполнить декремент.
Спасибо !!