我的问题涉及由并行 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
pragma 不在 omp parallel
部分内,在词法上这不是问题(甚至不相关)。
关于c++ - 被调用类中的 OpenMP 临界区(不同于并行循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18727381/