Qt Concurrent

开始使用

The QtConcurrent 命名空间提供高级API, 它无需使用低级线程原语(如互斥, 读写锁, 等待条件或信号量等), 编写多线程程序. QtConcurrent 根据可用处理器内核数量自动调整线程数量. 这表明, 现在的应用程序在未来的多核系统上自动扩展.

QtConcurrent 包含并行处理的函数式编程风格API, 如基于共享内存系统(非分布式)的MapReduce和FilterReduce实现, GUI应用程序中的管理异步计算类:

Qt Concurrent 支持几种STL兼容容器和迭代器类型, 但是最好使用Qt的随机访问容器, 如 QListQVector. map和filter函数同时接受容器和begin/end迭代器.

STL迭代器支持情况概览:

Iterator TypeExample classesSupport status
Input IteratorNot Supported
Output IteratorNot Supported
Forward Iteratorstd::slistSupported
Bidirectional IteratorQLinkedList, std::listSupported
Random Access IteratorQList, QVector, std::vectorSupported and Recommended

在Qt Concurrent中, 对大量轻量级的元素迭代时, 随机访问迭代器更快, 因为这类迭代器允许跳到容器的任意元素. 另外, 随机访问迭代器允许Qt Concurrent通过 QFuture::progressValue() 和 QFutureWatcher::progressValueChanged()函数提供进度信息.

非直接修改函数, 如调用 mapped() 和 filtered() 函数会生成容器副本. 如果你使用STL容器可能在复制操作花费一些时间. 在这种情况下, 我们建议你使用容器的begin/end迭代器.