为什么人们使用原子交换而不是存储?

3

那就是C++

atomic_int turn(0)

turn.exchange(1);
turn.store(1);

这两个代码的作用方式是相同的,对吗? 但是我查看了许多关于锁的例子都使用第一个。
为什么?

1
它们的工作方式不同。是的,两者都替换值,但atomic::exchange还返回调用前的值。无论如何,说“许多关于锁使用第一个”的说法太笼统了。展示一些这些例子将有助于我们理解为什么选择第一个。 - Wippo
1个回答

3

这两个语句都将一个值存储到原子变量中。 exchange 调用返回先前保存的值,而在本例中,该值被丢弃。但是,这并不意味着这两个调用完全相同。 exchange 操作是一种读取-修改-写入操作,而 store 操作仅是写入操作。这意味着如果我们有:

// thread 1
turn.store(0);  // A

// thread 2
turn.exchange(1);  // B

如果线程2读取了线程1存储的值,则A行与B行同步。如果线程2使用 store 而不是 exchange,则没有这样的同步。


1
我认为这个答案需要更多地阐述“线路A与线路B同步”的后果。 - Pete Becker
"如果线程2读取了线程1存储的值" 如果一棵树在森林中倒下并且返回值被忽略,那么这棵树在哪里? - curiousguy
这是一个很好的解释,展示了交换的用法。 - berkus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接