先把代码贴上来,有时间再整理吧。。因为工作中用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. HttpWebRequest 高效并发问题

    默认请求连接数 是2,在服务器操作系统上默认为10. 如果不修改这个并发连接限制,那么客户端同时可以建立的 http 连接数就只有2个或10个. System.Net.ServicePointMana ...

  2. PyCharm 安装package matplotlib为例

    File --> settings --> Project Interpreter --> 搜索 matplotlib 如果觉得官网下载的速度慢,可以添加阿里云的 repositor ...

  3. centOS redis的安装及配置

    1.下载redis的安装包 wget http://download.redis.io/releases/redis-4.0.2.tar.gz 我一般wget的文件都是在一个download的文件夹里 ...

  4. JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?

    本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部 ...

  5. SQL学习(一.索引)

    数据库索引 作用: 提高查询速度 确保数据的唯一性 可以加速表和表之间的连接,实现表和表之间的参照完整性 使用分组和排序子句进行数据检索时,可以减少分组和排序的时间 全文检索字段进行搜素优化 分类: ...

  6. ActiveMQ_1学习

    学习资源 官方文档 http://activemq.apache.org/features.html 下载ActiveMQ选择版本 http://activemq.apache.org/overvie ...

  7. input实现图片或视频上传(样式+代码)

    背景:vue/element.ui 1..html: <div v-show="recordForm.resourceType==1"> <el-form-ite ...

  8. 让IE8支持html5中的video标签

    这是一篇综合几个前辈的解决方案. 使用video的时候,要遇到的问题. ①不兼容ie9及其以下版本 在<head>里添加两行, 参考张鑫旭前辈的博客,但是在ie8中薄播放. <!-- ...

  9. Unity3D中的生命周期函数

    生命周期函数:需要继承 MonoBehaviour 类才能使用.生命周期函数全部都是由系统定义好的,系统会自动调用,且调用顺序和我们在代码里面的书写顺序无关. 常用的生命周期函数: Awake():唤 ...

  10. Mysql中比较常用的两种存储引擎和事务

    存储引擎:引擎(类似汽车上的发动机)决定了数据库的快慢,MySql中有20多个引擎,不同的存储引擎提供不同的存储机制.索引技巧.锁定水平.MYISAM存储引擎,INNODB存储引擎最出名.数据库的核心 ...