为什么像fetch-and-add这样的原子操作会返回被更改的变量的旧值?

has*_*hid 8 java opengl multithreading atomic atomicity

我正在努力学习并更好地理解多线程,但我对原子函数(如fetch-and-add)的行为感到困惑.在fetch-and-add的特定情况下,我理解一个值(假设当前等于5的x)被一个增量值(假设为3)加到,结果sum(8)被写入x的放在内存中,但返回旧的值(5).

在不同的地方还有其他几个这样的函数(比如OpenGL的原子函数,Java的AtomicIntegers,还有更多的区域)就像这样.但我不明白的是为什么代码中的一个地方想要写入内存但仍然首先返回它想要修改的值.任何人都可以帮助阐明这一点吗?

Ser*_*eyA 5

答案很简单。原子函数的本质是它们在执行时修改(在本例中递增)实际值,该值可能与代码所知道的值不同。

例子:

x = 5; // x is global
y = atomically_increment(x);
// what is y? 
Run Code Online (Sandbox Code Playgroud)

现在,如果在实际发生增量之前 x 碰巧从 5 变为 6,则 y 将等于 6,x 将等于 9。


小智 2

为了扩展谢尔盖的答案......

我认为 fetch-and-add 类似于信号量;除了获取和添加调用使一切成为原子操作。以下是显示原始值使用的算法示例: http: //research.omicsgroup.org/index.php/Ticket_lock