【发布时间】:2011-06-16 19:53:32
【问题描述】:
我刚刚注意到以下代码无法在 OpenMP(GCC 4.5.1 下)中编译:
struct job {
unsigned busy_children;
};
job* j = allocateJob(…);
// …
#pragma omp flush(j->busy_children)
编译器抱怨要刷新的参数列表中的 ->,根据 OpenMP 规范,这是正确的:flush 期望参数列表为“id-expression”列表,这基本上意味着仅(限定)允许使用 ID,不允许使用表达式。
此外,规范中提到了flush 和指针:
如果列表中存在指针,则刷新指针本身,而不是指针所指的内存块。
当然。但是,由于 OpenMP 也不允许我取消引用指针,因此我基本上无法刷新指针(指针目标)。
– 那么引用呢?规范没有提到它们,但我不确定以下是否符合要求,并且实际上会刷新指针。
unsigned& busy_children = j->busy_children;
#pragma omp flush(busy_children)
这能保证有效吗?
如果没有,如何刷新指针?
【问题讨论】:
-
MSDN 说“flush 指令中指定的变量不能有引用类型”。所以不能保证在所有平台上工作。不了解 GCC。
-
@Kyrill:啊,他妈的。顺便说一句,OpenMP 规范确实没有提到这一点,3.0 和 2.5 都没有。并且 MSDN 中的章节编号不同。
标签: c++ pointers reference openmp flush