atomic_compare_exchange vs mutex

PSI*_*Alt 7 c++ multithreading mutex atomic lock-free

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

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

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

小智 13

有许多优点;

  1. 这是一个很大更快(在Windows上,像10倍或100倍-与其说是在Linux上,像高10%)
  2. 它扩展MUCH更好(虽然还不够-只有大约100个逻辑核心)
  3. 这是MUCH冷却器和你似乎要聪明得多,能够
  4. 在不需要等待或休眠的情况下,此代码可用于禁止等待或休眠的地方,例如中断处理程序,Windows的某些部分(DISPATCH_LEVEL)和Linux内核等.

  • *卑微的弓*:-) (2认同)
  • 你忘记了负面观点:互斥体*很多*代码*和*更简单.无锁编码是一个雷区,很容易出错(特别是如果你想通过不使用顺序一致的内存顺序来真正地挤出它的最佳性能).多线程中最烦人的是:你无法通过运行简单的测试来验证代码,因为多线程代码不是确定性的(即使是串行代码也没有,但它更接近). (2认同)

Joh*_*int 6

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

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