先把代码贴上来,有时间再整理吧。。因为工作中用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. 事件委托在ios下面失效

    $(document).on("click","目标class",function(){ //安卓下点击可以,ios下面失效 }) 百度了下说是H5新定义的, ...

  2. grafana add custom dashboard

    grafana-dashboard-json prometheus-operator helm 中的grafana dashboard 扩展的时候,需要转换下载(https://grafana.com ...

  3. MFC禁用关闭按钮

    有时候我们在写MFC程序时,需要在对话框中开启线程处理一些事情,如果在线程执行过程中点击关闭按钮,会导致程序崩溃. 这里介绍一种解决方法,禁用关闭按钮 解决方法 开启线程前禁用关闭按钮 CMenu* ...

  4. C++ MFC棋牌类小游戏day6

    双人单机小游戏做完了,规则那部分还没介绍,暂时不打算介绍了,因为写的这个bug太多,我打算重新修改. 链接:https://pan.baidu.com/s/1XQKPSv0Tw36Qi2TeaRJiM ...

  5. left join on 和where中条件的放置位置

    转自:http://blog.csdn.net/muxiaoshan/article/details/7617533 select * from td  left join (select case_ ...

  6. 利用python同步windows和linux文件

    写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,然后再利用网络copy,重复性很大,就想着能不能写一个小脚本帮我同步 逻辑:比对本地和服务器文件的 ...

  7. FileInputStream与FileOutputStreawm实现文件的加密与解密

  8. Vuejs——(8)Vuejs组件的定义

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...

  9. bootstrap的化妆页面

    Glyphicons 字体图标 所有可用的图标 包括260个来自 Glyphicon Halflings 的字体图标.Glyphi cons Halflings 一般是收费的,但是他们的作者允许 Bo ...

  10. git diff 理解

    0. 理解 git diff 返回信息 1. 命令 $ git diff README.md 2. 返回信息,注解 diff --git a/README.md b/README.md ## 1. 表 ...