博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读写者锁与生产者/消费者模式
阅读量:6690 次
发布时间:2019-06-25

本文共 1115 字,大约阅读时间需要 3 分钟。

hot3.png

之前老是把读写者锁与生产者/消费者混淆,认为读写者是生产者/消费者的特例(当生产者个数为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

你可能感兴趣的文章
一个完整的类用来读取OpenSSL生成的pem格式的x509证书
查看>>
Delphi调用WebService(通过SoapHeader认证)经验总结
查看>>
2014年最新世界各国面积排名(172个国家)
查看>>
socket编程演示样例(多线程)
查看>>
C++ 初始化与赋值
查看>>
碰到的异常
查看>>
Android对话框-上篇-之系统对话框
查看>>
利用Segue在视图控制器间传值的问题
查看>>
发动机存隐患 现代起亚宣布在美召回16.8万辆车
查看>>
最前线|VIPKID正寻求4-5亿美元新一轮融资,估值达60亿美元
查看>>
文 OR 理?答案都在这里!
查看>>
XML+JSON面试题都在这里
查看>>
教你如何攻克Kotlin中泛型型变的难点(实践篇)
查看>>
2018Android面试经历
查看>>
不受限对抗样本挑战赛介绍
查看>>
浅解前端必须掌握的算法(三):直接插入排序
查看>>
[译] TensorFlow 教程 #06 - CIFAR-10
查看>>
阅读SSH的ERP项目【第二篇】
查看>>
如何有效的避免OOM,温故Java中的引用
查看>>
NSHipster: NSRegularExpression 中文版
查看>>