多线程读者写者问题--用QT实现
先把代码贴上来,有时间再整理吧。。因为工作中用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实现的更多相关文章
- 转---秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...
- OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)
一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...
- 多线程面试题系列(14):读者写者问题继 读写锁SRWLock
在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...
- Linux多线程实践(6) --Posix读写锁解决读者写者问题
Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *rest ...
- 读者写者问题继 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...
- 读者写者问题(有bug 后续更改)
与上一篇<秒杀多线程第十篇 生产者消费者问题>的生产者消费者问题一样,读者写者也是一个非常著名的同步问题.读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文 ...
- Java实现生产者消费者问题与读者写者问题
摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...
- linux 读者/写者自旋锁
内核提供了一个自旋锁的读者/写者形式, 直接模仿我们在本章前面见到的读者/写者旗标. 这些锁允许任何数目的读者同时进入临界区, 但是写者必须是排他的存取. 读者写者锁有 一个类型 rwlock_t, ...
- linux 读者/写者旗标
旗标为所有调用者进行互斥, 不管每个线程可能想做什么. 然而, 很多任务分为 2 种清 楚的类型: 只需要读取被保护的数据结构的类型, 和必须做改变的类型. 允许多个并发读 者常常是可能的, 只要没有 ...
随机推荐
- 选择困难症的福音——团队Scrum冲刺阶段-Day 1领航
选择困难症的福音--团队Scrum冲刺阶段-Day 1领航 各个成员在 Alpha 阶段认领的任务 小组成员 分工 任务量 严域俊 完成小游戏接口部分.小游戏编写部分 21 吴恒佚 决策判断部分.小游 ...
- 【轻松前端之旅】CSS选择器中的空格与尖括号有何区别?
CSS选择器中的空格与尖括号有何区别? 例子1: .a .b { margin: 0; } 空格隔开a和b,选择所有后代元素. 例子2: .a>.b { margin: 0; } 尖括号隔开a和 ...
- 学习Acegi应用到实际项目中(2)
Acegi应用到实际项目中(1)是基于BasicProcessingFilter的基本认证,这篇改用AuthenticationProcessingFilter基于表单的认证方式. 1.authent ...
- TJOI2018 简要题解
数学计算 用线段树记录之前乘过的每一个数,作除法时把原本的乘数改成111即可. 代码: #include<bits/stdc++.h> #define lc (p<<1) #d ...
- s6-1 传输层概述
6.1 传输层概述 传输层概述 传输层是整个协议栈(TCP/IP)的核心 传输层的任务是提供可靠的.高效的数据传输 传输层的地位 网络层.传输层和应用层 传输层在应用层和网络层之间提供了无缝接口 ...
- youtube-dl 安装和用法
以windows为例 下载python2最新版本并安装,选择添加到PATH 下载ffmpeg最新版本并解压,在控制面板->高级系统设置->环境变量->PATH里添加解压之后的bin文 ...
- VS2015离线安装NuGet Package
在一些情况下,VS2015直接安装NuGet Package的时候,速度异常缓慢: 所以还是考虑直接离线安装: Step1: 下载相应的Package https://www.nuget.org/ 然 ...
- DLL补丁劫持制作
DLL: 由于输入表中只包含 DLL 名而没有它的路径名,因此加载程序必须在磁盘上搜索 DLL 文件.首先会尝试从当前程序所在的目录加载 DLL,如果没找到,则在Windows 系统目录中查找,最后是 ...
- 开源播放器 ijkplayer (四) :Ijkplayer切换网络时停止播放的问题处理
问题起因: 在进行ijkplayer播放器的测试时,发现ijkplayer播放器在切换网络时出现直播画面停止的问题. 问题分析: 抓取日志发现:tv.danmaku.ijk.media.player. ...
- Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件
UI的描述 对于Android应用程序中,所有用户界面元素都是由View和ViewGroup对象构建的.View是绘制在屏幕上能与用户进行交互的一个对象.而对于ViewGroup来说,则是一个用于存放 ...