【问题标题】:OpenMP and STL vectorOpenMP 和 STL 向量
【发布时间】:2012-03-05 08:40:03
【问题描述】:

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

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

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

【问题讨论】:

  • 检查允许多次读写的 concurrent_vector

标签: c++ multithreading stl vector openmp


【解决方案1】:

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

原因是您没有使用可能导致重新分配的操作。 (如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。
  • @larsmans 是的,这是我使用的更好的措辞。 :) 我会改变的。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多