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