1

我的问题涉及由并行化 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_) 是否受到保护以防止并发更改?

4

1 回答 1

1

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

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

回答另一个问题:从词汇上看, omp ciriticalpragma 不在节内不是问题(甚至不相关) 。omp parallel

于 2013-09-10T19:55:58.913 回答