Qt 之 Concurrent
Getting Started
QtConcurrent命名空间提供了高级api,使编写多线程程序成为可能,而无需使用低级别线程原语,如互斥锁、读写锁、等待条件或信号量。用QtConcurrent编写的程序会根据可用的处理器核数自动调整使用的线程数。这意味着今天编写的应用程序在将来部署到多核系统时将继续扩展。
QtConcurrent 包括用于并行列表处理的函数式编程风格 API,包括用于共享内存(非分布式)系统的 MapReduce 和 FilterReduce 实现,以及用于管理 GUI 应用程序中的异步计算的类:
- Concurrent Map and Map-Reduce
- QtConcurrent::map() 将函数应用于容器中的每个项目,就地修改项目。
- QtConcurrent::mapped() 与 map() 类似,除了它返回一个带有修改的新容器。
- QtConcurrent::mappedReduced() 与mapped() 类似,只是修改后的结果被缩减或折叠成单个结果。
- Concurrent Filter and Filter-Reduce
- QtConcurrent::filter() 根据过滤器函数的结果从容器中删除所有项目。
- QtConcurrent::filtered() 与 filter() 类似,除了它返回一个带有过滤结果的新容器。
- QtConcurrent::filteredReduced() 与filtered() 类似,不同之处在于过滤的结果被减少或折叠成单个结果。
- Concurrent Run
- QtConcurrent::run() 在另一个线程中运行一个函数。
- QFuture
- QFuture 表示异步计算的结果。
- QFutureIterator 允许迭代通过 QFuture 可用的结果。
- QFutureWatcher 允许使用信号和槽来监控 QFuture。
- QFutureSynchronizer 是一个方便的类,可以自动同步多个 QFuture。
Qt Concurrent 支持多种与 STL 兼容的容器和迭代器类型,但最适合具有随机访问迭代器的 Qt 容器,例如 QList 或 QVector。 map 和 filter 函数接受 容器 和 表示开始与结束的迭代器。
STL Iterator support overview:
Iterator Type | Example classes | Support status |
---|---|---|
Input Iterator | Not Supported | |
Output Iterator | Not Supported | |
Forward Iterator | std::slist | Supported |
Bidirectional Iterator | QLinkedList, std::list | Supported |
Random Access Iterator | QList, QVector, std::vector | Supported and Recommended |
在 Qt Concurrent 迭代大量轻量级项目的情况下,随机访问迭代器可以更快,因为它们允许跳到容器中的任何点。 此外,使用随机访问迭代器允许 Qt Concurrent 通过 QFuture::progressValue() 和 QFutureWatcher::progressValueChanged() 提供进度信息。
非就地修改函数( 例如,mapped() 和 filtered() )在调用时会生成容器的副本。 如果您使用 STL 容器,此复制操作可能需要一些时间,在这种情况下,我们建议改为指定容器的开始和结束迭代器。