当前位置: 首页 > news >正文

QT并发机制

QT 提供了多种并发编程机制,使得开发者能够充分利用多核处理器优势,同时保持代码的可维护性和跨平台特性。以下是 QT 主要的并发机制:

1. QThread - 线程基础类

QThread 是 QT 中最基础的线程类,提供了创建和管理线程的能力。

class WorkerThread : public QThread {void run() override {// 在这里执行耗时操作qDebug() << "Worker thread running";}
};// 使用
WorkerThread *thread = new WorkerThread;
thread->start(); // 启动线程

2. 基于 QObject 的线程模型

更推荐的方式是将 QObject 移动到线程中:

class Worker : public QObject {Q_OBJECT
public slots:void doWork() {// 执行耗时任务emit resultReady(result);}
signals:void resultReady(const QString &result);
};// 使用
QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);connect(thread, &QThread::started, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, [](const QString &result){// 处理结果
});thread->start();

3. QtConcurrent - 高级并发API

QtConcurrent 提供了更高层次的并发编程接口:

// 并行映射
QList<int> list = {1, 2, 3, 4, 5};
QFuture<void> future = QtConcurrent::map(list, [](int &x){x *= 2;
});
future.waitForFinished(); // 等待完成// 并行过滤
QFuture<int> filtered = QtConcurrent::filtered(list, [](int x){return x > 5;
});// 并行归约
int sum = QtConcurrent::blockingReduced(list, [](int &result, int x){result += x;
});

4. QThreadPool 和 QRunnable

对于任务队列模式:

class Task : public QRunnable {void run() override {// 执行任务}
};// 使用
Task *task = new Task;
QThreadPool::globalInstance()->start(task);

5. 线程同步机制

QT 提供了多种线程同步工具:

  • QMutex - 互斥锁

    QMutex mutex;
    mutex.lock();
    // 临界区代码
    mutex.unlock();// 或使用 QMutexLocker
    QMutexLocker locker(&mutex);
    // 临界区代码
  • QReadWriteLock - 读写锁

    cpp

    QReadWriteLock lock;
    lock.lockForRead();  // 多个读取
    lock.lockForWrite(); // 单个写入
  • QSemaphore - 信号量

    QSemaphore sem(5); // 5个资源
    sem.acquire(3);    // 获取3个
    sem.release(2);    // 释放2个
  • QWaitCondition - 条件变量

    QWaitCondition condition;
    QMutex mutex;// 等待线程
    mutex.lock();
    condition.wait(&mutex);
    mutex.unlock();// 唤醒线程
    condition.wakeOne(); // 或 wakeAll()

6. 线程间通信

  • 信号槽机制:QT 的自动连接方式默认是队列连接(Qt::QueuedConnection),可以安全地跨线程通信

  • QMetaObject::invokeMethod:跨线程调用方法

    QMetaObject::invokeMethod(object, "methodName",Qt::QueuedConnection,Q_ARG(QString, "param"));

7. 异步操作

  • QFuture 和 QFutureWatcher 用于监控异步操作

    QFuture<int> future = QtConcurrent::run([](){return 42;
    });QFutureWatcher<int> *watcher = new QFutureWatcher<int>;
    connect(watcher, &QFutureWatcher<int>::finished, [](){qDebug() << "Done";
    });
    watcher->setFuture(future);

最佳实践

  1. 避免直接继承 QThread,推荐使用 moveToThread

  2. 主线程只用于 GUI 操作,耗时操作放在工作线程

  3. 使用信号槽进行线程间通信,避免直接共享数据

  4. 使用 QMutexLocker 等 RAII 类管理锁资源

  5. 考虑使用 QtConcurrent 简化并行算法实现

http://www.dtcms.com/a/267915.html

相关文章:

  • Qt实现外网双向音视频通话/支持嵌入式板子/实时性好延迟低/可以加水印
  • Linux系统移植(7.4)
  • C#实现CAN通讯接口
  • python-if结构、三目运算符
  • 一个简单的脚本,让pdf开启夜间模式
  • 【IOS】XCode创建firstapp并运行(成为IOS开发者)
  • Maixcam的使用3程序打包
  • 【机器学习笔记Ⅰ】13 正则化代价函数
  • 2025年6月AIGC发展全景:技术轻量化、Agent产业化与伦理新挑战
  • bottles安装网易云出现的问题01中文出现乱码问题
  • 等保测评-Apache Tomcat中间件
  • SpringMVC参数接收与数据返回详解
  • MySQL 8.0 主从复制原理分析与实战
  • 传统微商困境与开源链动2+1模式、AI智能名片及S2B2C商城小程序的转型破局
  • 数据挖掘:从理论到实践的深度探索
  • 基于腾讯云开发与“人·事·财·物”架构理念的家政预约小程序设计与实现
  • 【PyTorch】PyTorch中torch.nn模块的卷积层
  • 10.1《3步用ChatGPT+LangChain打造高质量私有数据集,模型效果提升200%》
  • Java多线程知识小结:Synchronized
  • Flink ClickHouse 连接器数据读取源码深度解析
  • G-sensor运动检测功能开源:打破技术壁垒,加速智能硬件开发!
  • Java JDBC的初步了解
  • 力扣网编程45题:跳跃游戏II之正向查找方法(中等)
  • 【深度学习新浪潮】AI在材料力学领域的研究进展一览
  • 基于51单片机智能婴儿床
  • SQL 一键生成 Go Struct!支持字段注释、类型映射、结构体命名规范
  • 从前端转go开发的学习路线
  • 3、Configuring Topics
  • I-Cache、D-Cache 和 SRAM 的区别与联系
  • 系统架构设计师论文分享-论软件体系结构的演化