2.6.4 不可部分完成的建構
atomic指示詞可確保特定記憶體位置會以原子方式是,更新而不是將它公開給可能的多個同時寫入執行緒。 語法atomic指示詞時,如下所示:
#pragma omp atomic new-line
expression-stmt
運算陳述式必須具有下列格式之一:
x binop= expr
x++
++x
x--
--x
在前面的運算式:
x 與純量型別是左值運算式。
expr 是純量型別,使用運算式,而不會參考所指定的物件 x。
binop多載的運算子並不是其中一個 +、 *、-,/、 &、 ^,|,<<,或 >>。
雖然它是由實作環境是否實作會取代所有atomic指示詞與重要指示詞,都具有相同唯一名稱、 atomic指示詞允許較高的最佳化。 通常硬體指令是可用的可執行具有最少負荷不可部分完成的更新。
只有載入和儲存區所指定的物件之 x 是不可部分完成 ; 評估 expr 不是不可部分完成。 若要避免競爭情形,應該加以保護平行的位置的所有更新與atomic指示詞,除了已知為可用的競爭情形。
若要限制atomic指示詞如下:
- 在整個程式的存放位置 x 不可部分完成的所有參考,都才能有相容的型別。
例如:
extern float a[], *p = a, b;
/* Protect against races among multiple updates. */
#pragma omp atomic
a[index[i]] += b;
/* Protect against races with updates through a. */
#pragma omp atomic
p[i] -= 1.0f;
extern union {int n; float x;} u;
/* ERROR - References through incompatible types. */
#pragma omp atomic
u.n++;
#pragma omp atomic
u.x -= 1.0f;