以下代码仅使用一个信号量就解决了两个线程的生产者-消费者问题。

sem_t sem; //init to 1
int arr[100];

void producer()
{
    while(;;) {
    sem_wait(sem)
    if it is fully filled {
        sem_post(sem);
    } else {
        run 100 times and fill the items

        sem_post(sem);
    }
    sleep(2);
    }
}

void consumer()
{
    while(;;) {
    sem_wait(sem)
    if it is empty {
        sem_post(sem);
    } else {
        run 100 times and read the items
        reset the start index to 0 so producer could fill again
        sem_post(sem);
    }
    sleep(2);
    }
}

int main()
{
    //create thread 1 calling consumer
    //create thread 2 calling producer
}

问题是为什么要使用两个信号量(空和完整)?不能用一个信号量解决问题?

最佳答案

需要两个信号量的原因是,当“垃圾箱”或生产者和使用者共享的任何内容已满时,生产者无法执行任何操作,但是当垃圾箱为空时,使用者无法执行任何操作。

因此,生产者需要有一个充满的信号灯,而消费者需要有一个空的信号灯。

关于c - 仅生产一个信号量的生产者-消费者的C解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30627851/

10-11 22:07