在qt的多线程编程中,如果有很多地方使用到共享变量,共享变量也很多,怎么保护起来?

在 Qt 的多线程编程中,如果有很多地方使用到共享变量,而共享变量也很多,为了保护共享变量,防止数据竞争(data race)和不一致性,需要使用适当的同步和互斥机制。Qt 提供了一些常用的同步工具,如互斥锁(mutex)、读写锁(read-write lock)和原子操作(atomic operations)等。以下是一些保护共享变量的常用方法:

互斥锁(QMutex):

使用 QMutex 类来保护共享变量。锁在变量的访问期间保持锁定状态,防止多个线程同时访问共享变量。示例如下:

cpp 复制代码
#include <QMutex>

QMutex mutex;  // 创建一个互斥锁
int sharedVariable;  // 定义一个共享变量

void updateSharedVariable(int newValue) {
    QMutexLocker locker(&mutex);  // 创建一个锁对象,在锁范围内自动加锁解锁
    sharedVariable = newValue;  // 在锁定状态下访问共享变量
}

int readSharedVariable() {
    QMutexLocker locker(&mutex);  // 锁定共享变量
    return sharedVariable;
}

读写锁(QReadWriteLock):

如果某个共享变量的读操作较多,而写操作较少,可以使用 QReadWriteLock 类来优化锁定操作。读写锁允许多个线程同时进行读操作,但只有一个线程可以进行写操作。示例如下:

cpp 复制代码
#include <QReadWriteLock>

QReadWriteLock rwLock;  // 创建一个读写锁
int sharedVariable;  // 定义一个共享变量

void updateSharedVariable(int newValue) {
    QWriteLocker locker(&rwLock);  // 创建一个写锁对象,在锁范围内自动加锁解锁
    sharedVariable = newValue;  // 在锁定状态下访问共享变量
}

int readSharedVariable() {
    QReadLocker locker(&rwLock);  // 创建一个读锁对象,在锁范围内自动加锁解锁
    return sharedVariable;
}

原子操作(QAtomicInt、QAtomicInteger 等):

Qt 提供了原子操作类,如 QAtomicInt、QAtomicInteger 等。这些类的操作是原子的,可以直接对共享变量进行原子操作,而无需使用锁。

cpp 复制代码
#include <QAtomicInt>

QAtomicInt sharedVariable(0);  // 定义一个原子整数

void updateSharedVariable(int newValue) {
    sharedVariable.storeRelease(newValue);  // 原子地更新共享变量
}

int readSharedVariable() {
    return sharedVariable.loadAcquire();  // 原子地读取共享变量
}

这些方法可以根据具体场景来选择和组合使用,以确保线程安全和数据一致性。需要根据共享变量的访问模式(读多写少、读少写多等)选择合适的锁策略。

相关推荐
软件黑马王子1 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
cpp_learners1 小时前
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度
qt·zlib·加密压缩·quazip
闲猫1 小时前
go orm GORM
开发语言·后端·golang
李白同学2 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
黑子哥呢?4 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
青龙小码农4 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿4 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
彳卸风5 小时前
Unable to parse timestamp value: “20250220135445“, expected format is
开发语言
数巨小码人5 小时前
QT SQL框架及QSqlDatabase类
jvm·sql·qt
dorabighead5 小时前
JavaScript 高级程序设计 读书笔记(第三章)
开发语言·javascript·ecmascript