Qt Concurrent
开始使用
The QtConcurrent 命名空间提供高级API, 它无需使用低级线程原语(如互斥, 读写锁, 等待条件或信号量等), 编写多线程程序. QtConcurrent 根据可用处理器内核数量自动调整线程数量. 这表明, 现在的应用程序在未来的多核系统上自动扩展.
QtConcurrent 包含并行处理的函数式编程风格API, 如基于共享内存系统(非分布式)的MapReduce和FilterReduce实现, GUI应用程序中的管理异步计算类:
- Concurrent Map 和 Map-Reduce
- QtConcurrent::map() 处理容器中的每个元素, 并在适当位置修改元素.
- QtConcurrent::mapped() 类似 map(), 不同之处是返回修改后的新容器.
- QtConcurrent::mappedReduced() 类似 mapped(), 不同之处是修改的结果被减少或折叠成单个结果.
- Concurrent Filter 和 Filter-Reduce
- QtConcurrent::filter() 根据函数结果从容器中移除所有符合条件的元素.
- QtConcurrent::filtered() 类似 filter(), 不同之处是返回一个符合函数结果的新容器.
- QtConcurrent::filteredReduced() 类似 filtered(), 不同之处是将过滤结果减少或折叠成单个结果.
- Concurrent Run
- QtConcurrent::run() 在另一个线程运行函数.
- QFuture 异步计算的结果.
- QFutureIterator QFuture的迭代器.
- QFutureWatcher 使用信号和槽函数监控 QFuture.
- QFutureSynchronizer 同步多个 QFutures 的便捷类.
Qt Concurrent 支持几种STL兼容容器和迭代器类型, 但是最好使用Qt的随机访问容器, 如 QList 或 QVector. map和filter函数同时接受容器和begin/end迭代器.
STL迭代器支持情况概览:
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容器可能在复制操作花费一些时间. 在这种情况下, 我们建议你使用容器的begin/end迭代器.