Qt Concurrent 模块提供高级 API,使无需使用如互斥、读写锁、等待条件或信号量的低级线程原语,编写多线程程序成为可能。采用 Qt Concurrent 编写的程序,会根据可用处理器核心数自动调整所用线程数。这意味着,今天编写的应用程序可继续延伸,当将来部署在多核系统时。
Qt Concurrent 包括用于并行列表处理的功能性编程样式 API,包括用于共享内存 (非分布式) 系统的 MapReduce 和 FilterReduce 实现,及在 GUI 应用程序中用于管理异步计算的类:
Qt Concurrent 支持几种 STL 兼容容器和迭代器类型,但最适合处理拥有随机访问迭代器的 Qt 容器,例如 QList 。映射和过滤函数接受容器及开始/结束迭代器两者。
STL 迭代器支持概述:
迭代器类型 | 范例类 | 支持状态 |
---|---|---|
输入迭代器 | 不支持 | |
输出迭代器 | 不支持 | |
转发迭代器 | std::slist | 支持 |
双向迭代器 | std::list | 支持 |
随机访问迭代器 | QList , std::vector | 支持并推荐 |
Random access iterators can be faster in cases where Qt Concurrent is iterating over a large number of lightweight items, since they allow skipping to any point in the container. In addition, using random access iterators allows Qt Concurrent to provide progress information through QFuture::progressValue () 和 QFutureWatcher::progressValueChanged ().
非原位修改函数 (譬如 mapped() 和 filtered()) 会拷贝容器,当调用时。若使用的是 STL 容器,此拷贝操作可能需要一些时间,在这种情况下,我们推荐指定开始和结束迭代器为代替容器。
使用 Qt 模块要求直接或透过其它依赖链接到模块库。一些构建工具为此有贡献支持,包括 CMake and qmake .
使用
find_package()
命令去定位所需模块组件,在
Qt6
包:
find_package(Qt6 COMPONENTS Concurrent REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Concurrent)
另请参阅 构建采用 CMake 概述。
要配置采用 qmake 构建模块,添加模块作为值为
QT
变量在工程的 .pro 文件:
QT += concurrent
Qt Concurrent 的变化 列出了 Qt 的 Qt 6 系列在模块 API 和功能上所做出的重要改变。
Qt Concurrent 模块在商业许可下是可用的来自 Qt 公司 。此外,它在自由软件许可下也是可用的: GNU LGPL (次一般公共许可) 第 3 版 ,或 GNU GPL (一般公共许可) 第 2 版 。见 Qt 许可 进一步了解细节。