QReadWriteLock的学习

参考:

Qt线程的简单使用--QReadWriteLock的用法_qt的读写锁怎么应用-CSDN博客

应用场景:多个线程同时进行读操作。

比如:100个线程进行读操作,1个线程进行写操作。

示例1:

cpp 复制代码
#include <QObject>
#include <QThread>
class Read_thread : public QThread
{
    Q_OBJECT
public:
    explicit Read_thread(QObject *parent = nullptr);
protected:
    void run();
};

class Write_thread : public QThread
{
    Q_OBJECT
public:
    explicit Write_thread(QObject *parent = nullptr);
protected:
    void run();
};
cpp 复制代码
#include <QReadWriteLock>
int counter=0;
QReadWriteLock lock;

void Read_thread::run()
{
    lock.lockForRead();
    for(int i=0;i<5;i++)
    {
        this->msleep(10);
        qDebug()<<"Read_thread:"<<QThread::currentThreadId()<<"   "<<counter;
    }
    lock.unlock();
}
void Write_thread::run()
{
    lock.lockForWrite();
    for(int i=0;i<5;i++)
    {
        counter++;
        this->msleep(10);
        qDebug()<<"Write_thread:"<<QThread::currentThreadId()<<"   "<<counter;
    }
    lock.unlock();
}
cpp 复制代码
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    qDebug()<<"main:"<<QThread::currentThreadId();
    connect(this,SIGNAL(destroyed()),this,SLOT(quitThreadSlot()));
    t=new Read_thread(this);
    t->start();

    t1=new Read_thread(this);
    t1->start();

    t2=new Write_thread(this);
    t2->start();

    t3=new Write_thread(this);
    t3->start();
}

void Widget::quitThreadSlot()
{
    t1->quit();
    t1->wait();

    t->quit();
    t->wait();

    t2->quit();
    t2->wait();

    t3->quit();
    t3->wait();
}

输出结果:

main: 0x5a08

Read_thread: 0x4f30 0

Read_thread: 0x62d8 0

Read_thread: 0x4f30 0

Read_thread: 0x62d8 0

Read_thread: 0x62d8 0

Read_thread: 0x4f30 0

Read_thread: 0x4f30 0

Read_thread: 0x62d8 0

Read_thread: 0x4f30 0

Read_thread: 0x62d8 0

Write_thread: 0x339c 1

Write_thread: 0x339c 2

Write_thread: 0x339c 3

Write_thread: 0x339c 4

Write_thread: 0x339c 5

Write_thread: 0x60b0 6

Write_thread: 0x60b0 7

Write_thread: 0x60b0 8

Write_thread: 0x60b0 9

Write_thread: 0x60b0 10
分析结果:

可以看到,允许不同的线程同时读counter,这里就是在交替地读counter,

之后进行写操作,不是交替进行的,

而是先执行Write_thread: 0x339c,

再执行Write_thread: 0x60b0。

即:可以同时读,不可以同时写。

示例2:修改部分代码:

cpp 复制代码
    t=new Read_thread(this);
    t->start();

    QThread::msleep(1000);
    t2=new Write_thread(this);
    t2->start();

    t3=new Write_thread(this);
    t3->start();

    t1=new Read_thread(this);
    t1->start();

输出结果:

main: 0x5c84

Read_thread: 0xb60 0

Read_thread: 0xb60 0

Read_thread: 0xb60 0

Read_thread: 0xb60 0

Read_thread: 0xb60 0

Write_thread: 0x3aa0 1

Write_thread: 0x3aa0 2

Write_thread: 0x3aa0 3

Write_thread: 0x3aa0 4

Write_thread: 0x3aa0 5

Write_thread: 0x4788 6

Write_thread: 0x4788 7

Write_thread: 0x4788 8

Write_thread: 0x4788 9

Write_thread: 0x4788 10

Read_thread: 0x38b0 10

Read_thread: 0x38b0 10

Read_thread: 0x38b0 10

Read_thread: 0x38b0 10

Read_thread: 0x38b0 10
分析:Read_thread: 0xb60先进行读操作

主线程阻塞1s

Write_thread: 0x3aa0进行写操作

Write_thread:0x4788进行写操作

Read_thread: 0x38b0进行读操作

示例3:QReadLocker和QWriteLocker的使用

cpp 复制代码
void Read_thread::run()
{
    QReadLocker locker(&lock);
    for(int i=0;i<5;i++)
    {
        this->msleep(10);
        qDebug()<<"Read_thread:"<<QThread::currentThreadId()<<"   "<<counter;
    }
}
cpp 复制代码
void Write_thread::run()
{
    QWriteLocker locker(&lock);
    for(int i=0;i<5;i++)
    {
        counter++;
        this->msleep(10);
        qDebug()<<"Write_thread:"<<QThread::currentThreadId()<<"   "<<counter;
    }
}

这样写只是更简单了一些,不需要再locked(),unlocked()了。

复制代码
相关推荐
YJlio30 分钟前
PsPing 学习笔记(14.7):一条龙网络体检脚本——连通性、延迟、带宽全都要
开发语言·网络·笔记·python·学习·pdf·php
我就是你毛毛哥36 分钟前
半导体的学习路线
学习
YJlio1 小时前
PsPing 学习笔记(14.8):常见错误与排障实战(超时、拒绝连接、权限问题)
开发语言·笔记·python·学习·django·pdf·pygame
潲爺2 小时前
Java笔记总结
java·开发语言·笔记·学习
菜的不敢吱声2 小时前
swift学习第一天
开发语言·学习·swift
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]namespace
linux·笔记·学习
L.fountain2 小时前
图像自回归生成(Auto-regressive image generation)实战学习(四)
人工智能·深度学习·学习·数据挖掘·回归
托尼吴2 小时前
milvus 向量数据库学习笔记-基础认识
数据库·学习·milvus
旖旎夜光2 小时前
linux(8)(下)
linux·学习
Hcoco_me3 小时前
大模型面试题37:Scaling Law完全指南
人工智能·深度学习·学习·自然语言处理·transformer