c++ - 被调用类中的 OpenMP 临界区(不同于并行循环)

标签 c++ openmp

我的问题涉及由并行 for 循环调用的类中的 OpenMP 临界区,该循环与临界区不属于同一类。 关键部分可以这样使用吗?

这是一个例子:

class TestFunction
{
    TestFunction( SomeSharedObject& _obj) : obj_(_obj) {}
    public:
    void possibly_change_sharedobj( ) 
    {
        #pragma omp critical(myCriticalSection)
        {
            obj_.do_something();
        }
    }
    SomeSharedobject& obj_;
};

class ClassWithParallelloop
{
     void parallelloop()
     {
         #pragma omp parallel for
         for( int i = 0; i < N; ++i)
         {
             TestFunction testfn( myobj_);
             testfn.possibly_change_sharedobj();
         } 
     }
     SomeSharedObject myobj_; 
 };

问:共享对象 (myobj_) 是否受到保护以防止并发更改?

最佳答案

不,myobj_ 没有“防止并发更改”,因为这不是关键部分 所做的。

他们做的是防止这些部分中的代码同时运行。因此,只要您保证关键部分*之外的代码不会访问 myobj_,您将阻止并发访问(这是隐式保护)。

回答另一个问题:omp ciritical pragma 不在 omp parallel 部分内,在词法上这不是问题(甚至不相关)。

关于c++ - 被调用类中的 OpenMP 临界区(不同于并行循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18727381/

相关文章:

c++ - 关于复制构造函数和指针

C++ 在堆上分配相同类型的变量会花费非常不同的时间

c - numactl --membind

gcc - GCC 编译器可以使用 nVidia GPU 来加速编译和/或链接吗?

c++ - 使用 Tiles 检查 2D 平台游戏中的碰撞

c++ - 打开成功却不好?

使用 OpenMP 的 C++ 并行平均矩阵

multithreading - 如何让一个线程等待另一个线程完成使用 OpenMP 线程?

java - 窗口缩放

c++在派生函数中启动OMP线程