2.6.5 Diretiva flush
O liberar diretiva, quer explícitas ou implícitas, especifica um ponto de "thread cruzado" seqüência na qual a implementação é exigida para garantir que todos os threads de uma equipe tenham uma visão consistente de determinados objetos (especificado abaixo) na memória. Isso significa que as avaliações anteriores de expressões que referenciam esses objetos forem concluídas e avaliações subseqüentes ainda não foram iniciadas. Por exemplo, compiladores devem restaurar os valores dos objetos registradores de memória e hardware, talvez seja necessário limpar os buffers de gravação para a memória e recarregar os valores dos objetos da memória.
A sintaxe do liberar diretiva é o seguinte:
#pragma omp flush [(variable-list)] new-line
Se os objetos que requerem sincronização podem ser designados por variáveis, essas variáveis podem ser especificados na opcional variável-list. Se houver um ponteiro no variável-list, o ponteiro propriamente dito é liberado, não o objeto que o ponteiro se refere a.
A liberar diretiva sem uma variável-list sincroniza todos compartilhados objetos, exceto objetos inacessíveis com duração de armazenamento automático. (Isso provavelmente terá mais sobrecarga do que uma liberar com um variável-list.) A liberar diretiva sem uma variável-list está implícito para as seguintes diretivas:
barrier
Na entrada e saída de crítico
Na entrada e saída daordered
Na entrada e saída de paralela
AT sair do para
AT sair do seções
AT sair do único
Na entrada e saída de paralela para
Na entrada e saída de seções paralelas
A diretiva não for implicada se um nowait cláusula está presente. É importante observar que o liberar diretiva não está implícito para qualquer um dos seguintes procedimentos:
Entrada para para
Na entrada ou saída da mestre
Entrada para seções
Entrada para único
Uma referência que acessa o valor de um objeto com um tipo qualificado volátil se comporta como se houvesse uma liberar diretiva especificando desse objeto no ponto de seqüência anterior. Uma referência que modifica o valor de um objeto com um tipo qualificado volátil se comporta como se houvesse uma liberar diretiva especificando desse objeto no ponto de seqüência subseqüentes.
Observe que, como o liberar diretiva não tem uma instrução de linguagem c como parte de sua sintaxe, há algumas restrições em sua colocação dentro de um programa. Consulte Apêndice C da gramática formal. O exemplo a seguir ilustra essas restrições.
/* ERROR - The flush directive cannot be the immediate
* substatement of an if statement.
*/
if (x!=0)
#pragma omp flush (x)
...
/* OK - The flush directive is enclosed in a
* compound statement
*/
if (x!=0) {
#pragma omp flush (x)
}
Restrições para o liberar diretiva são os seguintes:
- Uma variável especificada em um liberar diretiva não deve ter um tipo de referência.