先把代码贴上来,有时间再整理吧。。因为工作中用Qt,所以用Qt实现的。。。。刚上班,,忙!

三种方法,读者优先,写者优先和公平竞争。。

读者优先

#include <QCoreApplication>
#include <QThread>
#include <iostream>
#include <QMutex>
#include <QTime>
#include <QtGlobal>
using namespace std; int buffer;//临界资源
QMutex bMutex; class Reader:public QThread{
private:
static int readerCount;
static QMutex rdcnMutex;
static QMutex printMutex;
public:
void read(){
cout<<"读者读出:"<<buffer<<endl;
}
protected:
void run(){
rdcnMutex.lock();
if(readerCount == ){
bMutex.lock();
}
readerCount++;
rdcnMutex.unlock(); printMutex.lock();
sleep();
read();
printMutex.unlock(); rdcnMutex.lock();
readerCount--;
if(readerCount == ){
bMutex.unlock();
}
rdcnMutex.unlock();
}
}; int Reader::readerCount = ;
QMutex Reader::rdcnMutex;
QMutex Reader::printMutex; class Writer:public QThread{
public:
void write(){
qsrand(QTime(,,).secsTo(QTime::currentTime()));
buffer = qrand() % ;
cout<<"写者写入:"<<buffer<<endl;
}
protected:
void run(){
bMutex.lock();
sleep();
write();
bMutex.unlock();
}
}; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); buffer = -;
const int count = ;
Writer writer[count];
Reader reader[count];
for(int i = ; i < count; i++ ){
writer[i].start();
reader[i].start();
}
for(int i = ; i < count; i++ ){
writer[i].wait();
reader[i].wait();
} return a.exec();
}

写者优先:

#include <QCoreApplication>
#include <QMutex>
#include <QtGlobal>
#include <QThread>
#include <iostream>
#include <QtGlobal>
#include <QTime>
using namespace std; int buffer;//临界资源
QMutex bMutex;
QMutex queueMutex; class Reader: public QThread{
private:
static int readerCount;
static QMutex rdcnMutex;
static QMutex printMutex;
public:
void read(){
printMutex.lock();
cout<<"读者读出:"<<buffer<<endl;
printMutex.unlock();
}
protected:
void run(){
queueMutex.lock();
rdcnMutex.lock();
if(readerCount == ){
bMutex.lock();
}
readerCount++;
rdcnMutex.unlock();
queueMutex.unlock(); sleep();
read(); rdcnMutex.lock();
readerCount--;
if(readerCount == ){
bMutex.unlock();
}
rdcnMutex.unlock();
}
};
int Reader::readerCount = ;
QMutex Reader::rdcnMutex;
QMutex Reader::printMutex; class Writer: public QThread{
private:
static int writerCount;
static QMutex wtcnMutex;
public:
void write(){
qsrand(QTime(,,).secsTo(QTime::currentTime()));
buffer = qrand() % ;
cout<<"写者写入:"<<buffer<<endl;
}
protected:
void run(){
wtcnMutex.lock();
if(writerCount == ){
queueMutex.lock();
}
writerCount++;
wtcnMutex.unlock(); bMutex.lock();
sleep();
write();
bMutex.unlock(); wtcnMutex.lock();
writerCount--;
if(writerCount == ){
queueMutex.unlock();
}
wtcnMutex.unlock();
} };
int Writer::writerCount = ;
QMutex Writer::wtcnMutex; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); buffer = -;
const int count = ;
Writer writer[count];
Reader reader[count];
for(int i = ; i < count; i++ ){
writer[i].start();
reader[i].start();
}
for(int i = ; i < count; i++ ){
writer[i].wait();
reader[i].wait();
} return a.exec();
}

公平竞争

#include <QCoreApplication>
#include <QMutex>
#include <QtGlobal>
#include <QThread>
#include <iostream>
#include <QtGlobal>
#include <QTime>
using namespace std; int buffer;//临界资源
QMutex bMutex;
QMutex queueMutex; class Reader: public QThread{
private:
static int readerCount;
static QMutex rdcnMutex;
static QMutex printMutex;
public:
void read(){
printMutex.lock();
cout<<"读者读出:"<<buffer<<endl;
printMutex.unlock();
}
protected:
void run(){
queueMutex.lock();
rdcnMutex.lock();
if(readerCount == ){
bMutex.lock();
}
readerCount++;
rdcnMutex.unlock();
queueMutex.unlock(); sleep();
read(); rdcnMutex.lock();
readerCount--;
if(readerCount == ){
bMutex.unlock();
}
rdcnMutex.unlock();
}
};
int Reader::readerCount = ;
QMutex Reader::rdcnMutex;
QMutex Reader::printMutex; class Writer: public QThread{
private:
public:
void write(){
qsrand(QTime(,,).secsTo(QTime::currentTime()));
buffer = qrand() % ;
cout<<"写者写入:"<<buffer<<endl;
}
protected:
void run(){
queueMutex.lock();
bMutex.lock();
queueMutex.unlock();
sleep();
write();
bMutex.unlock(); } }; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); buffer = -;
const int count = ;
Writer writer[count];
Reader reader[count];
for(int i = ; i < count; i++ ){
writer[i].start();
reader[i].start();
}
for(int i = ; i < count; i++ ){
writer[i].wait();
reader[i].wait();
}
return a.exec();
}

多线程读者写者问题--用QT实现的更多相关文章

  1. 转---秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...

  2. OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)

    一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...

  3. 多线程面试题系列(14):读者写者问题继 读写锁SRWLock

    在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...

  4. Linux多线程实践(6) --Posix读写锁解决读者写者问题

    Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *rest ...

  5. 读者写者问题继 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...

  6. 读者写者问题(有bug 后续更改)

    与上一篇<秒杀多线程第十篇 生产者消费者问题>的生产者消费者问题一样,读者写者也是一个非常著名的同步问题.读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文 ...

  7. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  8. linux 读者/写者自旋锁

    内核提供了一个自旋锁的读者/写者形式, 直接模仿我们在本章前面见到的读者/写者旗标. 这些锁允许任何数目的读者同时进入临界区, 但是写者必须是排他的存取. 读者写者锁有 一个类型 rwlock_t, ...

  9. linux 读者/写者旗标

    旗标为所有调用者进行互斥, 不管每个线程可能想做什么. 然而, 很多任务分为 2 种清 楚的类型: 只需要读取被保护的数据结构的类型, 和必须做改变的类型. 允许多个并发读 者常常是可能的, 只要没有 ...

随机推荐

  1. LWIP学习

    转自:https://blog.csdn.net/kzq_qmi/article/details/46900589 数据包pbuf:    LwIP采用数据结构 pbuf 来描述数据包,其结构如下:  ...

  2. RNA提取和建库流程对mRNA-Seq的影响

    RNA提取和建库流程对mRNA-Seq的影响 已有 10460 次阅读 2014-8-14 14:21 |个人分类:转录组测序|系统分类:科研笔记|关键词:转录组测序,RNA-Seq,,链特异性RNA ...

  3. python08内置函数

    https://www.cnblogs.com/xiao1/p/5856890.html 1 .all(可迭代对象),对每个元素进行布尔运算,全部为真,函数结果就为真,否则为假 参数为一个整体的情况例 ...

  4. ipcam

    ipcam也叫ip network camera,就是基于internet protocol的网络摄像机,同普通摄像头或者网眼的主要区别是ipcam实际上是一台视频服务器和摄像头的集成.ipcam只要 ...

  5. Chapter3_操作符_方法调用中的别名问题

    接下来展示方法调用中的别名问题,方法调用中的别名问题指的是,将一个对对象的引用传递给某一个方法时,方法操作的是这一个特定的引用而不是这个引用的拷贝. class Person{ float heigh ...

  6. 2019.02.12 bzoj5294: [Bjoi2018]二进制(线段树)

    传送门 题意简述: 给出一个长度为nnn的二进制串. 你需要支持如下操作: 修改每个位置:1变0,0变1 询问对于一个区间的子二进制串有多少满足重排之后转回十进制值为333的倍数(允许前导000). ...

  7. Struts2学习第三天——保存登陆信息及数据校验

    在JSP中服务器端保存数据的作用域通常有request.session.application,它们对应的Servlet API分别是HttpServletRquerst.HttpSession.Se ...

  8. 有关PHPhash算法

    https://www.cnblogs.com/shangzekai/p/4444169.html

  9. 冲刺博客NO.9

    今天做了什么: 看书,看视频学UI设计,尝试设计并美化,然并没有美感,感觉自己设计的界面太丑. 主体进度差不多完成了,美化.

  10. nginx的权限问题(13: Permission denied)解决办法

    一个nginx带多个tomcat集群环境,老是报如下错误:   2012/03/07 15:30:39 /opt/nginx/proxy_temp/4/31/0000000314" fail ...