Функции sem_post, sem_wait и sleep - PullRequest
       10

Функции sem_post, sem_wait и sleep

0 голосов
/ 01 ноября 2018

Я пытаюсь выполнить следующее упражнение:

Машина А производит предмет каждые 2 секунды. Машина АА собирает изделие из 2-х предметов, произведенных машиной А.

Машина АА может собирать изделие каждую секунду, но для этого нужно 2 единиц товара, так что АА ждет 2 предмета от машины А.

Каждая машина работает в бесконечном цикле, но завод закрывается после 20 секунд и не ждет окончания работы машин.

Напишите программу, которая позволяет фабрике и машинам в ней, организованная работа в соответствии с требованиями завода.

У меня есть следующий вывод, и мой код должен выводить то же самое.

Output

Я пишу это:

#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;
}

и я получаю этот вывод:

3TimesPrinted

Я не понимаю, почему аппарат А печатает 3 раза в первый раз, и после этого он работает хорошо.

Если я изменю код машины A:

void* Machine_A() {
    while(1) {
        printf("Produced A\n");
        sem_post(&sem1);
        sleep(2);
    }
}

Я получаю правильный вывод.

Я не понимаю, почему он печатает Produced A 3 раза. Каждый раз sem_wait блокируется, пока не станет возможным выполнить декремент.

Спасибо !!

...