c++ - 正确使用 "atomic directive"来锁定STL容器

标签 c++ parallel-processing openmp

我有大量的整数集,我依次将它们放入一个指针 vector 中。我需要能够并行更新这些整数集而不会导致竞争条件。进一步来说。我正在使用 OpenMP 的“parallel for”结构。

为了处理共享资源,OpenMP 提供了一个方便的“原子指令”,它允许在不使用锁的情况下避免特定内存块上的竞争条件。 如果我可以使用“原子指令”来防止同时更新我的​​整数集会很方便,但是,我不确定这是否可行。

基本上,我想知道以下代码是否会导致竞争条件

vector< set<int>* > membershipDirectory(numSets, new set<int>);

#pragma omp for schedule(guided,expandChunksize)
for(int i=0; i<100; i++)
  {
    set<int>* sp = membershipDirectory[rand()];
    #pragma omp atomic
      sp->insert(45);
  }

请注意,我为索引使用了一个随机整数,因为在我的应用程序中,任何线程都可能访问任何索引(在我较大的应用程序中有一个随机元素,但我不需要详细说明)。

我看到一个similar example of this for incrementing an integer ,但我不确定在我的情况下使用指向容器的指针时它是否有效。

最佳答案

四处寻找后,我找到了 OpenMP C and C++ API manual在 openmp.org 和第 2.6.4 节中,描述了原子构造的局限性。

基本上,原子指令只能与以下运算符一起使用:

一元: ++, --(前缀和后缀)

二进制: +,-,*,/,^,&,|,<<,>>

所以我只会使用锁!

(在某些情况下,关键部分可能更可取,但在我的例子中,锁将提供对共享资源的细粒度访问,从而产生比关键部分更好的性能。)

关于c++ - 正确使用 "atomic directive"来锁定STL容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2690245/

相关文章:

c - 为什么这个 OpenMP 程序每次都给我不同的答案?

openmp - OpenMP 中的原子性和关键性有什么区别?

c++ - 如何并行化一个循环?

c++ - 在没有清晰边界/边缘的图像中找到矩形空间

c++ - 宏功能未按预期扩展

algorithm - 有哪些简单的令人尴尬的并行算法?

c++ - C++ 对象构造函数中的 Openmp 使用

c++ - 简单 while 循环的问题

c++ - 如何处理QSslSocket : cannot resolve TLSv1_1_client_method error

ios - 后台快速处理 viewDidLoad 上的一项艰巨任务