Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenMP:for循环中可能存在的不同条件_C++_Multithreading_For Loop_Parallel Processing_Openmp - Fatal编程技术网

C++ OpenMP:for循环中可能存在的不同条件

C++ OpenMP:for循环中可能存在的不同条件,c++,multithreading,for-loop,parallel-processing,openmp,C++,Multithreading,For Loop,Parallel Processing,Openmp,我想使用OpenMP来并行化for循环(我以前也使用std::threads完成过,但那个解决方案相当难看),不过每次迭代时它的条件可能会改变。 下面是我的意思的例子: #pragma omp parallel for for(int i = 0; i < someVector.size(); i++) { . . . if(something) someVector.push_back(v); } #pragma omp parallel for 对于(int i=0;i

我想使用OpenMP来并行化for循环(我以前也使用std::threads完成过,但那个解决方案相当难看),不过每次迭代时它的条件可能会改变。 下面是我的意思的例子:

#pragma omp parallel for
for(int i = 0; i < someVector.size(); i++)
{
. . .
if(something)
   someVector.push_back(v);
}
#pragma omp parallel for
对于(int i=0;i
然而,这是行不通的。循环似乎一直延伸到初始的someVector.size()值。有没有办法在OpenMP中并行这种构造?

OpenMP
#pragma omp for
了解for循环中的条件。它知道它迭代从0到某个最大值的数字,因此它在开始时计算最大值,然后将工作划分为多个线程。如果最大值在循环执行过程中发生更改,则不会生效

此外,在其他线程使用时修改std::vector显然不安全。您将获得未定义的行为,可能是由于在向量增长时移动存储数据后访问释放的内存而崩溃


您可以用一些线程安全队列替换
std::vector
。然后,您可以使用多个辅助对象并行地自由地弹出和推入值。

此代码不符合要求:for语句没有规范要求的规范形式,即可以使用
#pragma omp parallel for
注释的循环(本规范第2.6节)


问题出在条件表达式中:规范规定,如果条件表达式的形式为
i relational op expr
expr
必须是循环不变表达式,并且此约束不是由代码实现的。

依赖于
i
的东西吗?否,它与此无关。如果它使用全局数据,那么您似乎不太可能将其并行化。