OpenMP和STL向量

cbd*_*cbd 16 c++ multithreading stl vector openmp

我有一些代码,我想以下列方式使用OpenMP:

std::vector<int> v(1000);
# pragma omp parallel for
for (int i = 0; i < 1000; ++i) {
    v[i] = i;
}
Run Code Online (Sandbox Code Playgroud)

我已经读过,在多个线程写入单个容器的情况下,STL向量容器不是线程安全的,这意味着我需要在进行任何写入之前锁定向量; 但是,我也被告知上面的写操作在某种程度上是"原子的",所以上面没有竞争条件.有人可以澄清一下吗?

Mys*_*ial 26

在这个特定的例子中,它将是安全的.

原因是您没有使用可能导致重新分配的操作.(如push_back()).您只是更改单个元素的内容.

请注意,您可以合法地执行此操作:

std::vector<int> v(1000);
int *ptr = &v[0];

# pragma omp parallel for
for (int i = 0; i < 1000; ++i) {
    ptr[i] = i;
}
Run Code Online (Sandbox Code Playgroud)

当你开始调用的方法,如它变得不线程安全的push_back(),pop_back(),insert(),等...从多个线程.

我还要补充一点,这个特殊的例子并不适合并行性,因为几乎没有任何工作要做.但我想这只是一个愚蠢的例子,目的是提出这个问题.

  • "不修改向量本身" - >"不使用可能导致重新分配的操作".但无论如何+1. (4认同)