进程的同步-----生产者与消费者问题
问题描述:
生产者在放的时候,不能同时放
消费者在拿的时候,不能同时拿
生产者放的时候,消费者也不能拿
这是互斥关系
然后生产者往缓冲区放,消费者从缓冲区拿
这是同步关系
使用P、V操作时的注意事项
P、V操作总是成对出现的;互斥操作时他们处于同一进程中;同步操作时他们处于不同进程中。
P、V操作的位置十分重要,放置不当会造成严重后果,注意逻辑关系
读者--写者问题
问题描述:一个数据对象(文件、记录)可以为多个并发进程共享。其中有的进程只需要读其中的内容,我们称为“读者”;有的进程负责更新其中内容(读/写),我们称为“写者”。“读者”可以同时读取共享数据对象;“写者”不能和其他任何进程同时访问数据对象。
如何实现?
分析:
读--写:互斥访问
写--写:互斥访问
读--读:允许同时访问
第一类读者--写者问题:“读者”优先,只要有读进程在读,写进程被迫等待。
设置信号量
semaphore mutex,write;//公用信号量,用于互斥
mutex=1;write=1;//设置初值
int readcount//计数,用于记录读者的数目
读者进程:
P(mutex);//对readcount互斥
readcoujt++;//读者数目加一
if(readcount==1)//第一个读进程
P(write)//申请使用data资源
V(mutex)//释放readcount
reading;
P(mutex);//对readcount互斥
readcount--;
if(readcount==0)//最后一个进程
V(write);//释放data资源
V(mutex);//释放readcount
写者进程:
P(write);//申请使用data资源
writing;
V(write);//释放data资源