技术背景:
硬件的发展变成多核,而软件设计主要针对单一计算核心实现,由于架构的影响,软件并不能充分利用多个运算核心带来的性能提升。
解决方案:
利用多线程将应用程序并行化,充分利用CPU的多个运算核心。
什么时候需要使用多线程:
- 程序中需要大量的运算,比如图像处理、三维建模等
- 时间密集型或处理密集型的事务妨碍用户界面的相应
- 单独的事务必须等待外部速度较慢的资源,例如打印任务需要等待答应机等
PLL是微软在Visual C++2010中提供的一种简化多线程应用程序开发的编程模型。PLL建立在并发运行时的调度和资源管理组件之上,在代码与底层线程机制之间插入一层抽象层,提供支持并发的泛化、类型安全的算法和并行容器。
特性:
- 并行计算:并行作用于一组数据的泛化算法
- 并行任务:一个可并行执行的几个工作单元(任务)的机制
- 并行容器和对象:可安全的并发存取其元素的泛化容器
PLL三种常用的并行算法
- 1.parallel_for算法
//标准forx循环
for(int i= 0;i<100;i++)
{
//循环体
}
//并行的for循环
parallel_for(0,100,1,
[&](int i) //parallel_for()算法的LAmbda表达式
{
//循环体
});
//接收4个参数,起始值、终止值、步长以及表示FOR循环体的Lambda表达式,
- 2.parallel_for_each算法
vector<int> vec;
parallel_for_each(vec_beigin(),vec.end(),
[&](int& i) //parallel_for_each()算法的LAmbda表达式
{
//对容器的数据进行处理
}
);
//接收3个参数,起始值、终止值以及表示FOR循环体的Lambda表达式,
- 3.parallel_invoke()算法
//线程的创建和管理
//并行执行任务 可以接受2-10个函数对象作为参数,这些函数就是各个线程的线程函数,
parallel_invoke(
[=]{
for (int i = 0;i<100;i++)//任务1:输出0到100的整数
{
cout <<i <<endl;
}
},
[=]{
for(int i = 0;i<10;i++)
{
cout<<" " <<i<<endl;
}
}
);