原子與運算元

可以在不同執行緒之間同時訪問原子變數,而不會產生競爭條件。

/* a global static variable that is visible by all threads */
static unsigned _Atomic active = ATOMIC_VAR_INIT(0);

int myThread(void* a) {
  ++active;         // increment active race free
  // do something
  --active;         // decrement active race free
  return 0;
}

允許基型別允許的所有左值操作(修改物件的操作),並且不會導致訪問它們的不同執行緒之間的競爭條件。

  • 原子物件的操作通常比正常算術操作慢幾個數量級。這還包括簡單的載入或儲存操作。所以你應該只將它們用於關鍵任務。
  • 通常的算術運算和賦值如 a = a+1; 實際上是對 a 的三個操作:首先是載入,然後是加法,最後是儲存。這不是免費匹配。只有操作 a += 1;a++;