OpenMP: como liberar o alvo do ponteiro?
Acabei de perceber que o código a seguir não é compilado no OpenMP (no GCC 4.5.1):
struct job {
unsigned busy_children;
};
job* j = allocateJob(…);
// …
#pragma omp flush(j->busy_children)
O compilador reclama sobre o->
na lista de argumentos para liberar, e de acordo com a especificação do OpenMP, é correto:flush
espera como argumentos uma lista de "expressões id", o que basicamente significa que apenas IDs (qualificados) são permitidos, sem expressões.
Além disso, a especificação diz isso sobreflush
e ponteiros:
Se um ponteiro estiver presente na lista, o ponteiro será liberado, não o bloco de memória ao qual o ponteiro se refere.
Claro. No entanto, como o OpenMP também não me permitedesreferência os ponteiros Eu basicamente não consigo liberar um apontador (alvo do ponteiro).
- E as referências? As especificações não as mencionam, mas não estou confiante de que o seguinte seja conforme e, na verdade, liberará o pontapé.
unsigned& busy_children = j->busy_children;
#pragma omp flush(busy_children)
Isso está garantido para funcionar?
Se não,como posso liberar um pontapé?