[英]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.