以下代码仅使用一个信号量就解决了两个线程的生产者-消费者问题。
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/