生产者消费者问题
-
释放资源的是生产者,使用资源的是消费者。资源可以是软件也可以是硬件的。
-
如果资源是数据,有以下几个角色,承担对应的职责:
- 生产者:生产数据放到缓冲区
- 缓冲区
- 任何时候只有一个主体访问
- 满时无法放数据,空时无法取数据。
- 消费者:从缓冲区取走数据
-
缓冲区可以分为:
-
有界缓冲区
- 互斥操作+ 同步关系
-
无界缓冲区
-
i指第一个空闲位置, j指第一个存数据位置.
-
i、j的更新不需要考虑空、满的情况,因为信号量empty、full已经进行了保证。
-
要确保一旦申请到了mutex,必须能够正常执行。不然占着mutex会导致死锁。
-
semaphore mutex; mutext.value= 1 //互斥访问信号量 semaphore empty; empty.value= n; //空资源信号量, 放数据用 semaphore full; full.value= 0 //有数据信号量, 取数据用 int i, j ITEM Buffer[n] ITEM data_p, data_c //三个信号量,分别确保有空位、互斥、有数据。 void producer(){ while(true){ produce an item in data_p wait(empty) //确保有空闲位置 wait(mutex) //进入临界区 Buffer[i]= data_p i= (i+1)%n //更新空闲位置 signal(mutex) //离开临界区 signal(full) //声明放了数据 } } void consumer(){ while(true){ wait(full) //确保有数据 wait(mutex) //进入临界区 data_c= Buffer[j] j= (j+1)%n signal(mutex) //退出临界区 signal(empty) //声明有空位 } }
-
-