函数sem_post,sem_wait和sleep

时间:2018-11-01 16:43:51

标签: c multithreading semaphore

我正在尝试解决以下练习:

  

机器A每2秒产生一个项目。 AA机组装   机器A生产的2件商品中的商品。

     

一台AA机器每秒可以组装一个产品,但需要2个   每个产品有2个项目,因此机管局正在等待机器A的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

我不明白为什么机器A第一次打印3次,然后才能正常工作。

如果我更改机器A的代码:

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

我得到正确的输出。

我不明白为什么它会打印Produced A 3次。 每次sem_wait阻塞,直到有可能执行递减操作为止。

谢谢!

0 个答案:

没有答案