欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

嵌入式--QT]线程同步 - 基于 QReadWriteLock 的线程同步

最编程 2024-03-20 07:17:12
...

使用互斥量存在一个问题,每次只能有一个线程获得互斥量的权限,如果在一个程序中有多个线程读取某个变量,使用互斥量时也必须排队,而实际上若只是读取一个变, 是可以让多个线程同时访问的,这样互斥量就会降低程序的性能。
它是基于读或写的模式进行代码段锁定的,在多个线程读写一个共享数据时,可以解决上面所说的互斥量存在的问题,QReadWriteLock以读或写锁定的同步方法允许以读或写的方式保护一段代码,它可以允许多个线程以只读方式同步访问资源,但是只要有一个线程在以写方式访问资源时,其他线程就必须等待直到写操作结束。
QReadLocker和QWriteLocker是QReadWriteLock简便形式。

主要函数

  • lockForRead():以只读的方式锁定资源,如果有其他线程以写入方式锁定,这个函数会阻塞;
  • lockForWrite():以写入方式锁定资源,如果本线程或其他线程以读或写模式锁定资源,这个函数就阻塞;
  • unlock():解锁;
  • tryLockForRead():是lockForRead()非阻塞版本;
  • tryLockForWrite():是lockForWrite()非阻塞版本;

代码示例
ReadWriteThread.h

#ifndef READWRITETHREAD_H
#define READWRITETHREAD_H

#include <QObject>
#include <QThread>
#include <QReadWriteLock>
#include <QReadLocker>
#include <QWriteLocker>

class ReadWriteThread : public QThread
{
    Q_OBJECT
public:
    ReadWriteThread();

    void run() Q_DECL_OVERRIDE;

    QReadWriteLock lock;
};

#endif // READWRITETHREAD_H

ReadWriteThread.cpp

#include "ReadWriteThread.h"

ReadWriteThread::ReadWriteThread() {}

// void ReadWriteThread::run()
// {
//     QWriteLocker lockW(&lock);
//     lock.lockForWrite();
//     //模拟线程1数据写入代码
//     //。。。
//     lock.unlock();
// }


// void ReadWriteThread::run()
// {
//     QReadLocker lockR(&lock);
//     lock.lockForRead();
//     //模拟线程2读取数据代码
//     //。。。
//     lock.unlock();
// }



void ReadWriteThread::run()
{
    //QReadLocker lockR(&lock);
    lock.lockForRead();
    //模拟线程3读取数据代码
    //。。。
    lock.unlock();
}