原子与算子

可以在不同线程之间同时访问原子变量,而不会产生竞争条件。

/* 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++;