博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Parallel STL
阅读量:7035 次
发布时间:2019-06-28

本文共 1624 字,大约阅读时间需要 5 分钟。

考虑一个算法,代码如下:

#include 
void process(int& x){ //do some calculate}int main(){ int arr[100000]; std::for_each( arr, arr+100000, [](auto & x){ process(x); });}

for_each对于每一个数组arr的成员,都去调用了process(int& x)。这个过程是单线程(main所在的主线程)进行的。

如果想增加性能,让多线程并行的处理,需要做一些改造。例如,创建线程1处理0-30000项,创建线程2处理30001-60000项,主线程处理剩余项。

在C++17中,可以请求算法库做并行处理。怎么请求呢?代码如下:

#include 
//...int main(){ int arr[100000]; std::for_each( std::execution::par, arr, arr+10000, [](auto & x){ process(x); });}

新的重载函数多出了个指定策略的参数std::execution::par。这个参数意味着算法库可能会偷偷的创建后台线程辅助完成for_each算法。

另外还有std::execution::seq,和std::execution::par_unseq。这些都是算法库预定义的常量。

因为标准库算法都会涉及到对容器和元素的读写操作,在多线程条件下,就会有数据竞争问题。数据竞争的解决,是库的用户责任。这意味着有时候就需要用互斥量,内存模型等机制保护数据的完整性。

例如:下面这段代码,程序可能要挂掉了。在多线程环境下,对共享的资源v的插入会出现不可预知的错误。

int a[] = {
0,1,3,4,5,6,7,8,9};std::vector
v;std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int i) { v.push_back(i*2+1); // 错误:数据竞争});

最直接的解决方式,加锁保护,代码如下:

int a[] = {
0,1,3,4,5,6,7,8,9};std::vector
v;std::mutex m;std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int i) { std::lock_guard
guard(m); //互斥量保护v v.push_back(i*2+1); });

有三种并行策略,各个含义如下:

std::execution::seq

调用者线程单线程方式,以不确定的顺序访问元素
std::execution::par
多线程(由库隐式的创建线程)方式,在每个线程中,以不确定的顺序访问元素
std::execution::par_unseq
multiple threads and may be vectorized - calls are unsequenced with respect to each other and possibly interleaved

我完全没懂,需要再研究。什么是“不确定顺序的“(indeterminately sequenced)?什么是“向量化的”(vectorized)?什么是交互的“interleaved”?都是什么鬼?

转载于:https://www.cnblogs.com/thomas76/p/8554668.html

你可能感兴趣的文章
Boost核心类库精讲
查看>>
C协程使用举例
查看>>
过程日志定位疑难问题
查看>>
rails3 unicorn部署
查看>>
织梦开发——相关阅读likeart应用
查看>>
理解eclipse(java工程)的工作目录
查看>>
德国"反黑客"法出炉:拥有黑客工具是非法的
查看>>
OEM解析:WayOs PC、ISP、BCM等各版本OEM的大概过程
查看>>
sql 分页查询
查看>>
between and 相关
查看>>
VC++错误 'OnLButtonDown' : member function not declared in 'CYx2_31View'
查看>>
Java中List转换为Array
查看>>
Tomcat 7绑定域名
查看>>
[PAL编程规范]SAP HANA PAL逻辑回归预测分析Logistic Regression编程规范FORECASTWITHLOGISTICR(预测)...
查看>>
php empty,isset,is_null比较(差异与异同)
查看>>
磁盘分区对齐的重要性
查看>>
MVC3和MVC4相关问题
查看>>
Django文档——Model字段选项(Field Options)
查看>>
关于ARM NEON学习的一些资料
查看>>
火车运煤问题
查看>>