QtConcurrent (Qt并发)命名空间提供了高级 API,可以在不使用低级线程原语(例如互斥锁、读写锁、等待条件、信号量)的情况下编写多线程程序。使用 QtConcurrent 编写的程序会根据可用的处理器内核数量自动调整使用的线程数量。
QtConcurrent 包括用于并行列表处理的函数式编程风格 API,包括用于共享内存(非分布式)系统的 MapReduce 和 FilterReduce 实现,以及用于管理 GUI 应用程序中的异步计算的类:
1、Concurrent Map 和 Map-Reduce:
- QtConcurrent::map() 将函数应用于容器中的每个项目,就地修改容器中的项目。
- QtConcurrent::mapped() 与 map() 类似,除了它返回一个带有修改项目的新容器。
- QtConcurrent::mappedReduced() 与mapped() 类似,只是修改后的结果被缩减或折叠成单个结果。
2、Concurrent Filter 和Filter-Reduce:
- QtConcurrent::filter() 根据过滤器函数的结果从容器中删除所有项目。
- QtConcurrent::filtered() 与 filter() 类似,除了它返回一个带有过滤结果的新容器。
- QtConcurrent::filteredReduced() 与filtered() 类似,不同之处在于过滤的结果被减少或折叠成单个结果。
3、Concurrent Run:
- QtConcurrent::run() 在另一个线程中运行一个函数。
4、QFuture 表示异步计算的结果。
5、QFutureIterator 允许迭代 QFuture 可用的结果。
6、QFutureWatcher 允许使用信号槽来监控 QFuture。
7、QFutureSynchronizer 是一个便捷类,可以自动同步多个 QFuture。
Qt Concurrent 支持多种与 STL 兼容的容器和迭代器类型,但最适合具有随机访问迭代器的 Qt 容器,例如 QList 或 QVector。 map 和 filter 函数接受容器和begin/end迭代器。
迭代器支持概述:
迭代器类型 | 示例 | 是否支持 |
---|---|---|
输入迭代器 | 不支持 | |
输出迭代器 | 不支持 | |
前向迭代器 | std::slist | 支持 |
双向迭代器 | QLinkedList、std::list | 支持 |
随机访问迭代器 | QList、QVector、std::vector | 支持且推荐使用 |
在 Qt Concurrent 迭代大量轻量级项目的情况下,随机访问迭代器可以更快,因为它们允许跳到容器中的任何点。此外,使用随机访问迭代器允许 Qt Concurrent 通过 QFuture::progressValue() 和 QFutureWatcher::progressValueChanged() 提供进度信息。
非就地修改函数(例如 mapped() 和 filtered())在调用时会生成容器的副本。如果使用 STL 容器,此复制操作可能需要一些时间,在这种情况下,建议改为指定容器的begin/end迭代器。