读写者锁与生产者/消费者模式

之前老是把读写者锁与生产者/消费者混淆,认为读写者是生产者/消费者的特例(当生产者个数为1时),后来才发现(也不知道现在的理解对不对:D),读写者模式中,多个读写可以同时读文件,而生产者/消费者模式中,消费者在消费时需要互斥。

读写者锁: 有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件。

一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。

生产者/消费者

需要三个对象,互斥对象/事件/信号量/临界区对象: mutex,信号量:empty,full,分别表示空缓冲项和满缓冲项个数,emtpy初始化为为n,full初始化为0。伪代码如下:

生产者
while(condition){
    WaitForSingleObject(empty);
    Enter(mutex);
    //生产
    Leave(mutex);
    ReleaseSemaphore(emtpy);
}
消费者
while(condition2){
    wait(full);
    wait(mutex);
    //消费
    signal(mutex);
    signal(full);
}

读写

三个对象,互斥对象/事件/信号量/临界区对象: mutex,wrt, int readcount. readcount初始化为0

写
while(condition){
    Enter(wrt);
    //写
    Leave(wrt);
}
读
while(condition2){
    Enter(mutex);
    readcount++;
    if(1 == readcount) //多个读者可以一起读,因此,只要1个获得了读,其他也就获得了。
        Enter(wrt);
    Leave(mutex);
    //读
    Enter(mutex);
    readcount--;
    if(0 == readcount) //所有读者完成后,释放锁
        Leave(wrt);
    Leave(mutex);
}

MFC程序可以使用SRWLock来同步,C#程序则可以使用ReaderWriterLock来同步

转载于:https://my.oschina.net/shanlilaideyu/blog/485374

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值