PV操作
P操作:
(1)S=S-1;
(2)如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V操作:
(1)S=S+1;
(2)如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
#define N 100
typedef int semaphore;
semaphore mutex=1;
semaphore empty=N;
semaphore full=0;
void producer()
{
int item;
while(true)
{
item=produce_item();
down(&empty);
down(&mutex);
insert_item(item);
up(&mutex);
up(&full);
}
}
void consumer()
{
int item;
while(true)
{
down(&full);
down(&mutex);
item=remove_item();
up(&mutex);
up(&empty);
consume_item(item);
}
}
过程:
(1)生产者执行down(&empty),empty=N-1>=0,生产者把一个产品放到缓冲区;
(2)生产者执行up(&full),full=1>0,激活消费者执行down(&full),full=0>=0,消费者从缓冲区取出一个产品;
(3)消费者执行up(&empty),激活生产者执行down(&empty),生产者继续把一个产品放到缓冲区。