qt concurrent 用法
1. 简介
qtconcurrent
是 Qt 框架中一个用于多线程编程的模块。它提供了一种使用简单、高效的方式来执行并行任务和操作的接口。通过使用 qtconcurrent
,我们可以很容易地将串行代码转换为并行代码,从而提高程序的响应速度和性能。
2. 使用场景
在讨论 qtconcurrent
的用法之前,我们首先来看一下在什么样的场景下使用它是一个不错的选择。
- 对称性任务(Symmetric Tasks):当我们需要对一组数据执行相同类型的操作时,可以使用
qtconcurrent::mapped
函数。例如,将一个列表中的每个元素都乘以 2。QList<int> numbers = QList<int>() << 1 << 2 << 3 << 4 << 5; QList<int> doubledNumbers = qtconcurrent::mapped(numbers, [](int n){ return n * 2; });
- 归约操作(Reducing Operations):当我们需要对一组数据进行归约操作(例如求和、计数、最大/最小值等),可以使用
qtconcurrent::reduce
函数。QList<int> numbers = QList<int>() << 1 << 2 << 3 << 4 << 5; int sum = qtconcurrent::reduce(numbers, [](int a, int b){ return a + b; });
- 过滤操作(Filtering Operations):当我们需要根据某些条件过滤数据时,可以使用
qtconcurrent::filter
函数。QList<int> numbers = QList<int>() << 1 << 2 << 3 << 4 << 5; QList<int> evenNumbers = qtconcurrent::filter(numbers, [](int n){ return n % 2 == 0; });
- 映射-归约操作(Mapping-Reducing Operations):当我们需要对一组数据进行映射和归约操作时,可以使用
qtconcurrent::mappedReduced
函数。QList<int> numbers = QList<int>() << 1 << 2 << 3 << 4 << 5; int sumOfDoubledNumbers = qtconcurrent::mappedReduced(numbers, [](int n){ return n * 2; }, [](int a, int b){ return a + b; });
3. 使用示例
3.1 对称性任务示例
假设我们有一个存储了一系列整数的列表,我们想将其中的每个元素都乘以 2。我们可以使用 qtconcurrent::mapped
函数实现这个功能。
#include <QtConcurrent/QtConcurrent>
#include <QList>
#include <QDebug>
int main()
{
QList<int> numbers = QList<int>() << 1 << 2 << 3 << 4 << 5;
QList<int> doubledNumbers = qtconcurrent::mapped(numbers, [](int n){ return n * 2; });
qDebug() << doubledNumbers;
return 0;
}
运行结果:
(2, 4, 6, 8, 10)
3.2 归约操作示例
假设我们有一个存储了一系列整数的列表,我们想计算这些整数的总和。我们可以使用 qtconcurrent::reduce
函数实现这个功能。
#include <QtConcurrent/QtConcurrent>
#include <QList>
#include <QDebug>
int main()
{
QList<int> numbers = QList<int>() << 1 << 2 << 3 << 4 << 5;
int sum = qtconcurrent::reduce(numbers, [](int a, int b){ return a + b; });
qDebug() << sum;
return 0;
}
运行结果:
15
3.3 过滤操作示例
假设我们有一个存储了一系列整数的列表,我们想筛选出其中的偶数。我们可以使用 qtconcurrent::filter
函数实现这个功能。
#include <QtConcurrent/QtConcurrent>
#include <QList>
#include <QDebug>
int main()
{
QList<int> numbers = QList<int>() << 1 << 2 << 3 << 4 << 5;
QList<int> evenNumbers = qtconcurrent::filter(numbers, [](int n){ return n % 2 == 0; });
qDebug() << evenNumbers;
return 0;
}
运行结果:
(2, 4)
3.4 映射-归约操作示例
假设我们有一个存储了一系列整数的列表,我们想将其中的每个元素都乘以 2,然后对结果进行求和。我们可以使用 qtconcurrent::mappedReduced
函数实现这个功能。
#include <QtConcurrent/QtConcurrent>
#include <QList>
#include <QDebug>
int main()
{
QList<int> numbers = QList<int>() << 1 << 2 << 3 << 4 << 5;
int sumOfDoubledNumbers = qtconcurrent::mappedReduced(numbers, [](int n){ return n * 2; }, [](int a, int b){ return a + b; });
qDebug() << sumOfDoubledNumbers;
return 0;
}
运行结果:
30
4. 注意事项
在使用 qtconcurrent
进行多线程编程时,有几个需要注意的事项。
qtconcurrent
提供的函数是线程安全的,可以在多个线程中同时使用。qtconcurrent
大部分函数都是基于 C++11 中的 lambda 表达式实现的,所以我们需要确保编译器支持 C++11。qtconcurrent
可以自动根据可用的硬件资源(CPU 核心数量)来进行任务调度,从而充分利用多核处理器的性能。
总结
qtconcurrent
是 Qt 框架中一个强大的多线程编程模块。通过使用它,我们可以方便地将串行代码转换为并行代码,从而提高程序的响应速度和性能。在本文中,我们介绍了 qtconcurrent
的用法,并给出了相关的示例代码和运行结果。