用
这样的块替换互斥锁有什么意义
void stack_push(stack* s, node* n)
{
node* head;
do
{
head = s->head;
n->next = head;
}
while ( ! atomic_compare_exchange(s->head, head, n));
}
无法理解用这种原子清除替换互斥锁可以获得什么好处?
有许多优点;
- 它要快得多(在Windows上,例如10倍或100倍 - 在Linux上则不然,例如10%更好)
- 它的扩展性要好得多(尽管仍然不够 - 仅扩展到大约 100 个逻辑内核)
- 它更酷,你看起来更聪明,更有能力 在不需要等待或休眠的地方,
- 此代码可用于禁止等待或休眠的地方,例如中断处理程序、Windows (DISPATCH_LEVEL) 和 Linux 内核的某些部分等
它通常比互斥锁快。 话虽如此,您不能简单地将所有互斥体替换为 CAS。 单个 CAS 将在多个线程之间安全地将一个引用与另一个引用交换。
例如,如果您有一个复合函数,其中一次写入依赖于另一个读取,则需要互斥锁来确保原子性。