繁体   English   中英

被调用类中的OpenMP关键部分(与并行循环不同)

[英]OpenMP critical sections in called classes (different than parallel loop)

我的问题涉及由并行化的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编译指示不在词法上的omp parallel部分内不是问题(甚至不相关)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM