簡體   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