嵌入式--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();
}
推荐阅读
-
Java 线程中对象的同步和异步
-
控制进程或线程同步互斥的四种方法
-
进程同步、互斥和通信之间的区别,进程同步和线程同步之间的区别
-
Java 线程同步和互斥:让您的程序在并发世界中翩翩起舞
-
同步多个线程的四种方法(史上最详细+使用案例)
-
有多少种方法可以实现多线程同步和互斥?什么是同步和互斥,操作系统如何实现同步和互斥,进程和线程之间的关系是什么,进程比线程的开销是多少?
-
线程同步与互斥的区别
-
Java 并发编程:Java 中的进程和线程 - Java 线程同步
-
Linux] 多线程多线程 --- 同步 + POSIX 信号量 + 基于环形队列的生产者-消费者模式
-
嵌入式--QT]线程同步 - 基于 QReadWriteLock 的线程同步