Qt Concurrent
Qt Concurrent 模块提供了一组高级API,使开发者能够编写多线程程序,而无需使用互斥锁、读写锁、等待条件或信号量等低级线程原语。 使用Qt Concurrent 编写的程序会根据可用处理器核心的数量自动调整所使用的线程数。这意味着今天编写的应用程序在未来部署到多核系统上时,仍能保持良好的可扩展性。
Qt Concurrent 包含用于并行列表处理的函数式编程风格 API,其中包括针对共享内存(非分布式)系统的 MapReduce 和 FilterReduce 实现,以及用于在 GUI 应用程序中管理异步计算的类:
- 并发 Map 和 Map-Reduce
- QtConcurrent::map() 将一个函数应用于容器中的每个项目,并就地修改这些项目。
- QtConcurrent::mapped() 与 map() 类似,不同之处在于它会返回一个包含修改结果的新容器。
- QtConcurrent::mappedReduced() 与 mapped() 类似,不同之处在于会将修改后的结果进行归约或折叠,最终生成单一结果。
- 并行过滤与过滤-归约
- QtConcurrent::filter() 根据过滤函数的结果,从容器中移除所有项目。
- QtConcurrent::filtered() 与 filter() 类似,不同之处在于它返回一个包含过滤后结果的新容器。
- QtConcurrent::filteredReduced() 与 filtered() 类似,不同之处在于,过滤后的结果会被归约或折叠为单一结果。
- 并发运行
- QtConcurrent::run() 在另一个线程中运行一个函数。
- 并发任务
- QtConcurrent::task() 会创建一个 `QtConcurrent::QTaskBuilder` 的实例。该对象可用于调整参数,并在单独的线程中启动任务。
- QFuture 表示异步计算的结果。
- QFutureIterator 允许遍历通过 `QFuture` 提供的结果。
- QFutureWatcher 允许通过信号与槽机制监听QFuture 。
- QFutureSynchronizer 是一个便利类,可自动同步多个 QFuture。
- QPromise 提供了一种将异步计算的进度和结果报告给 `QFuture` 的方法。允许在 `QFuture` 请求时暂停或取消任务。
Qt Concurrent 支持多种与 STL 兼容的容器和迭代器类型,但与具有随机访问迭代器的 Qt 容器(如QList )配合使用效果最佳。map 和 filter 函数既接受容器,也接受起始/结束迭代器。
STL 迭代器支持概述:
| 迭代器类型 | 示例类 | 支持状态 |
|---|---|---|
| 输入迭代器 | 不支持 | |
| 输出迭代器 | 不支持 | |
| 正向迭代器 | std::forward_list | 受支持 |
| 双向迭代器 | std::list | 已支持 |
| 随机访问迭代器 | QList、std::vector | 受支持且推荐 |
当Qt Concurrent 遍历大量轻量级项时,随机访问迭代器可能更快,因为它们允许直接跳转到容器中的任意位置。此外,使用随机访问迭代器还能让Qt Concurrent 通过QFuture::progressValue()和QFutureWatcher::progressValueChanged()提供进度信息。
诸如 mapped() 和 filtered() 之类的非就地修改函数在被调用时会创建容器的副本。如果您使用的是 STL 容器,此复制操作可能会耗费一些时间,在这种情况下,我们建议您改为指定容器的起始和结束迭代器。
使用该模块
使用 Qt 模块需要将其与模块库进行链接,可以是直接链接,也可以通过其他依赖项间接链接。包括CMake和qmake 在内的多种构建工具都对此提供了专门的支持。
使用 CMake 构建
使用find_package() 命令在Qt6 包中定位所需的模块组件:
find_package(Qt6 REQUIRED COMPONENTS Concurrent)
target_link_libraries(mytarget PRIVATE Qt6::Concurrent)另请参阅“使用 CMake 构建”概述。
使用 qmake 构建
要配置模块以便使用 qmake 进行构建,请在项目的 .pro 文件中将该模块作为QT 变量的值添加:
QT += concurrent示例
模块演变
Qt Concurrent列出了为 Qt 6 系列所做的模块 API 和功能方面的重大变更。
许可
Qt Concurrent 模块由The Qt Company 提供商业许可证。此外,它还提供自由软件许可证:GNU 较少通用公共许可证第 3 版或GNU 通用公共许可证第 2 版。更多详细信息请参阅Qt 许可。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.