atomic_compare_exchange vs mutex



这样的块替换互斥锁有什么意义

void stack_push(stack* s, node* n)
{
    node* head;
    do
    {
        head = s->head;
        n->next = head;
    }
    while ( ! atomic_compare_exchange(s->head, head, n));
} 

无法理解用这种原子清除替换互斥锁可以获得什么好处?

有许多优点;

  1. 它要快得多(在Windows上,例如10倍或100倍 - 在Linux上则不然,例如10%更好)
  2. 它的扩展性要好得多(尽管仍然不够 - 仅扩展到大约 100 个逻辑内核)
  3. 它更酷,你看起来更聪明,更有能力
  4. 在不需要等待或休眠的地方,
  5. 此代码可用于禁止等待或休眠的地方,例如中断处理程序、Windows (DISPATCH_LEVEL) 和 Linux 内核的某些部分等

它通常比互斥锁快。 话虽如此,您不能简单地将所有互斥体替换为 CAS。 单个 CAS 将在多个线程之间安全地将一个引用与另一个引用交换。

例如,如果您有一个复合函数,其中一次写入依赖于另一个读取,则需要互斥锁来确保原子性。

相关内容

  • 没有找到相关文章

最新更新