Я только что заметил, что следующий код не компилируется в OpenMP (в соответствии с GCC 4.5.1):
struct job {
unsigned busy_children;
};
job* j = allocateJob(…);
// …
#pragma omp flush(j->busy_children)
Компилятор жалуется на ->
в списке аргументов для сброса,и в соответствии со спецификацией OpenMP это правильно: flush
ожидает в качестве аргументов список «id-выражений», что в основном означает, что разрешены только (квалифицированные) идентификаторы, без выражений.
Кроме того, в спецификации говоритсяэто около flush
и указателей:
Если указатель присутствует в списке, сам указатель сбрасывается, а не блок памяти, на который ссылается указатель.
Конечно.Однако, поскольку OpenMP также не позволяет мне разыменовать указатели, я в принципе не могу сбросить указатель (цель указателя).
- Так что же со ссылками?Спецификация не упоминает их, но я не уверен, что следующее согласуется, и на самом деле очистит pointee.
unsigned& busy_children = j->busy_children;
#pragma omp flush(busy_children)
Это гарантированно сработает?
Если нет, как мне смыть пуанти?