Solution to the Producer-Consumer problem using Semaphores
One problem with implementing a Sleep and Wakeup policy is the potential for losing Wakeups. Semaphores solve the problem of lost wakeups. In the Producer-Consumer problem, semaphores are used for two purposes:
- mutual exclusion and
- synchronization.
In the following example there are three semaphores. Full, used for counting the number of slots that are full; empty, used for counting the number of slots that are empty; and mutex, used to enforce mutual exclusion.
BufferSize = 3;
semaphore mutex = 1; // Controls access to critical section
semaphore empty = BufferSize; // counts number of empty buffer slots
semaphore full = 0; // counts number of full buffer slots
Producer()
{
int widget;
while (TRUE) { // loop forever
make_new(widget); // create a new widget to put in the buffer
down(&empty); // decrement the empty semaphore
down(&mutex); // enter critical section
put_item(widget); // put widget in buffer
up(&mutex); // leave critical section
up(&full); // increment the full semaphore
}
}
Consumer()
{
int widget;
while (TRUE) { // loop forever
down(&full); // decrement the full semaphore
down(&mutex); // enter critical section
remove_item(widget); // take a widget from the buffer
up(&mutex); // leave critical section
up(&empty); // increment the empty semaphore
consume_item(widget); // consume the item
}
}
本文介绍如何利用信号量解决生产者-消费者问题中的互斥与同步难题。通过设置三个信号量:mutex用于互斥访问缓冲区,empty记录空闲缓冲槽数量,full记录已填充缓冲槽数量,确保了生产者与消费者进程的安全交互。
4269

被折叠的 条评论
为什么被折叠?



