7

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

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

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

4

2 回答 2

14

有很多优点;

  1. 快得多(在 Windows 上,比如 10 倍或 100 倍 - 在 Linux 上没那么多,比如快 10%)
  2. 它的扩展性要好得多(尽管仍然不够——只有大约 100 个逻辑核心)
  3. 更酷,你看起来更聪明更有能力
  4. 在不需要等待或休眠的地方,此代码可用于禁止等待或休眠的地方,例如中断处理程序、Windows 的某些部分 (DISPATCH_LEVEL) 和 Linux 内核等
于 2012-09-20T15:42:00.463 回答
7

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

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

于 2012-09-20T15:37:52.730 回答