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

时间:2013-09-10 19:34:04

标签: 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_)是否受到并发更改的保护?

1 个答案:

答案 0 :(得分:1)

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

他们做什么,阻止这些部分中的代码同时运行。因此, 只要 ,您就可以保证关键部分之外没有代码 * 访问{{1你将阻止并发访问(这是隐式保护)。

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