本页内容

Qt Concurrent

Qt Concurrent 模块提供了一组高级API,使开发者能够编写多线程程序,而无需使用互斥锁、读写锁、等待条件或信号量等低级线程原语。 使用Qt Concurrent 编写的程序会根据可用处理器核心的数量自动调整所使用的线程数。这意味着今天编写的应用程序在未来部署到多核系统上时,仍能保持良好的可扩展性。

Qt Concurrent 包含用于并行列表处理的函数式编程风格 API,其中包括针对共享内存(非分布式)系统的 MapReduce 和 FilterReduce 实现,以及用于在 GUI 应用程序中管理异步计算的类:

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.