深入理解QT并发机制

 更新时间:2025年07月09日 09:24:58   作者:byxdaz  
QT提供了多种并发编程机制,使得开发者能够充分利用多核处理器优势,同时保持代码的可维护性和跨平台特性,下面就来介绍一下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 - 读写锁

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);

最佳实践

  • 避免直接继承 QThread,推荐使用 moveToThread
  • 主线程只用于 GUI 操作,耗时操作放在工作线程
  • 使用信号槽进行线程间通信,避免直接共享数据
  • 使用 QMutexLocker 等 RAII 类管理锁资源
  • 考虑使用 QtConcurrent 简化并行算法实现

到此这篇关于深入理解QT并发机制的文章就介绍到这了,更多相关QT并发机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C++中auto关键字的使用

    C++中auto关键字的使用

    本文主要介绍了C++中auto关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 2048小游戏C语言实现代码

    2048小游戏C语言实现代码

    这篇文章主要为大家详细介绍了2048小游戏C语言实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境(图文教程)

    Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境(图文教程)

    这篇文章主要介绍了Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • C++新特性详细分析基于范围的for循环

    C++新特性详细分析基于范围的for循环

    C++11这次的更新带来了令很多C++程序员期待已久的for range循环,每次看到javascript, lua里的for range,心想要是C++能有多好,心里别提多酸了。这次C++11不负众望,再也不用羡慕别家人的for range了。下面看下C++11的for循环的新用法
    2022-04-04
  • Visual Studio 2022使用MinGW来编译调试C/C++程序的图文教程

    Visual Studio 2022使用MinGW来编译调试C/C++程序的图文教程

    这篇文章主要介绍了Visual Studio 2022使用MinGW来编译调试C/C++程序,以实例来简单介绍一下VS2022中如何使用MinGW来编译、调试C/C++程序,需要的朋友可以参考下
    2022-08-08
  • C语言字符函数、内存函数功能及实现代码

    C语言字符函数、内存函数功能及实现代码

    这篇文章主要介绍了C语言字符函数、内存函数 功能及实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • C++与Qt的内存管理机制详解

    C++与Qt的内存管理机制详解

    这篇文章主要介绍了C++与Qt的内存管理机制使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • C/C++实现精灵游戏的示例代码

    C/C++实现精灵游戏的示例代码

    这篇文章主要为大家介绍了如何利用C++实现简单的精灵游戏,文中的示例代码讲解详细,有一定的参考价值,感兴趣的小伙伴可以了解一下
    2022-06-06
  • Qt中读取csv文件的三种主要方法

    Qt中读取csv文件的三种主要方法

    本文介绍了在Qt中读取CSV文件的三种主要方法:基础方法(QFile+QTextStream)、模型法(QStandardItemModel)和数据库法(QSqlDatabase),基础方法适合直接处理数据,模型法便于界面展示,数据库法则适用于复杂查询,文章提供了详细的代码示例,需要的朋友可以参考下
    2026-01-01
  • C++实现LeetCode(38.计数和读法)

    C++实现LeetCode(38.计数和读法)

    这篇文章主要介绍了C++实现LeetCode(38.计数和读法),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论