您当前的位置: 首页 >  qt

lw只吃亿点.

暂无认证

  • 11浏览

    0关注

    47博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt读写锁(QReadWriteLock)的使用、读写锁的验证(含源码+注释)

lw只吃亿点. 发布时间:2022-03-29 22:14:34 ,浏览量:11

文章目录
  • 一、读写锁验证示例图
  • 二、读写锁、QReadWriteLock(个人理解)
  • 三、源码
    • 3.1 CThread(读写锁使用类)
    • 3.2 CMainWindow(线程调用类)
  • 总结
  • 相关文章

一、读写锁验证示例图

下图为Qt读写锁的演示及验证,在下图中可以看出两个读取数据的函数会一起调用(代表读写锁支持读取锁线程一起运行),且数据操函数并不会调用;而当数据操作函数调用时,两个数据读取函数也不会调用。由此可知,当读取锁开启时,写入锁不能进入,反之亦然。源码在本文第三节(源码含详细注释)。 在这里插入图片描述 提示:不会使用Qt设计师设计界面的小伙伴点击这里。

二、读写锁、QReadWriteLock(个人理解)

当有多个线程使用同一块数据且其中部分线程不会对数据做出改变时(多个线程使用同一个锁)。如果使用QMutex实现,同一时间,只能有一个线程可以运行,这样的话会影响效率。 理论上说,那部分不会对数据做出改变的线程可以同时运行;因此,读写锁出现了,当读取锁开启时并不影响其他使用读取锁的线程,可以一起运行,只是写入锁不能进入;但当写入锁开启时,其他线程就只有等待当前开启写入锁的线程解锁才能运行。

三、源码 3.1 CThread(读写锁使用类)

CThread.h

#ifndef CTHREAD_H
#define CTHREAD_H

#include 
#include 
#include 

class CThread : public QThread
{
    Q_OBJECT
public:
    explicit CThread(QObject *parent = nullptr);
    ~CThread();

    void run();

    void setFlag(char flag);

    void readFunc1();   //读取操作1函数

    void readFunc2();   //读取操作2函数

    void writeFunc();   //数据操作函数

private:
    static QReadWriteLock *m_sLock;   //定义静态读写锁(方便所有当前线程类对象使用)

    char        m_flag;         //定义char变量存储当前线程的字符

};

#endif // CTHREAD_H

CThread.cpp

#include "CThread.h"
#include 
#include 

QReadWriteLock * CThread::m_sLock = new QReadWriteLock; //为静态变量new出对象

CThread::CThread(QObject *parent)
    : QThread(parent)
{
}

CThread::~CThread()
{
}

void CThread::run()
{
    int i = 0;
    //循环输出当前标识符4次
    while(i++ != 4)
    {
        if(0 == m_flag)
        {
            //写入锁上锁
            m_sLock->lockForWrite();
            writeFunc();    //数据操作的内容
            m_sLock->unlock();  //解锁
        }
        else if(1 == m_flag)
        {
            //读取锁上锁
            m_sLock->lockForRead();
            readFunc1();    //数据读取的内容
            m_sLock->unlock();  //解锁
        }
        else
        {
            //读取锁上锁
            m_sLock->lockForRead();
            readFunc2();    //数据读取的内容
            m_sLock->unlock();  //解锁
        }
    }
    qDebug()             
关注
打赏
1654352885
查看更多评论
0.1776s