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(),等...从多个线程.
我还要补充一点,这个特殊的例子并不适合并行性,因为几乎没有任何工作要做.但我想这只是一个愚蠢的例子,目的是提出这个问题.
| 归档时间: |
|
| 查看次数: |
10219 次 |
| 最近记录: |