原子与算子
可以在不同线程之间同时访问原子变量,而不会产生竞争条件。
/* 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++;
。