OpenMP和STL向量

时间:2012-02-13 22:37:26

标签: 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;
}

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

2 个答案:

答案 0 :(得分: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;
}

当您从多个线程开始调用push_back()pop_back()insert()等方法时,它变得非线程安全。

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

答案 1 :(得分:0)

多次读取是安全的,但我建议避免多次写入同一容器。但是你可以写入你自己管理的内存。与向量的不同之处在于您可以确保不会同时更改或重新分配内存。否则你也可以使用信号量,但这可能会降低效率,如果使用多个信号,如果你不能正常工作,它甚至会导致死锁。