2.6.5 排清指示詞
排清指示詞,無論是外顯或隱含的會指定"跨執行緒"序列點的實作,才能確保小組中的所有執行緒都具有一致 (下述) 在記憶體中特定物件的檢視。 這表示前一個評估的運算式參考這些物件都已完成,而且還沒有開始後續的評估。 例如,編譯器必須還原從暫存器物件的值到記憶體,而硬體可能需要清除記憶體的寫入緩衝區並重新載入記憶體中物件的值。
語法排清指示詞時,如下所示:
#pragma omp flush [(variable-list)] new-line
如果需要進行同步處理的物件所有被指定的變數,那麼這些變數可指定在選擇性的變數清單。 如果變數的指標出現在變數清單、 清除指標本身、 非物件指標參考。
A 排清 指示詞,而不 變數清單自動存放工期與同步處理所有的共用物件,但無法存取的物件。 (這是可能有更多的額外負荷,比排清 與 變數清單。) A 排清 指示詞,而不 變數清單隱含的下列指示詞:
barrier
在進入和離開要徑
在進入和離開ordered
在進入和離開平行
在結束的
在結束區段
在結束單一
在進入和離開的平行
在進入和離開平行的區段
如果不表示該指示詞nowait子句會出現。 請注意, 排清指示詞不會表示為下列其中一項:
在進入的
在進入或離開母片
在進入區段
在進入單一
存取的暫時性限定的型別物件值的參考就會當做有排清指示詞指定該物件在先前的序列點。 修改與靜態限定的型別物件的值的參考就會當做沒有排清指示詞指定該物件在後續的序列點。
請注意,因為排清指示詞並沒有 c 語言陳述式做為其語法的一部分,有一些限制,在程式中的位置上。 請參閱 < 附錄 c 的正式的文法。 下列範例會示範這些限制。
/* 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)
}
若要限制排清指示詞如下:
- 在指定的變數排清指示詞不可以有參考型別。