共用方式為


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;