fetch_and_add 和 fetch_and_addlp 子例程

用途

以原子方式更新变量。

标准 C 库 (libc.a)

语法

#include <sys/atomic_op.h>
int fetch_and_add ( addr,  value)
atomic_p addr;
int value;

long fetch_and_addlp ( addr,  value)
atomic_l addr;
ulong value;

描述

fetch_and_addfetch_and_addlp 子例程在单个原子操作中递增一个单词。 当在多个线程或进程之间共享计数器变量时,此操作很有用。 更新此类计数器变量时,确保访存,更新和存储操作以原子方式发生 (不可中断) ,这一点很重要。 例如,考虑在操作可中断的情况下可能发生的事件的顺序:

  1. 进程会访存计数器值并向其添加一个值。
  2. 第二个进程访存计数器值,添加一个值并存储该值。
  3. 第一个进程存储其值。

这样做的结果是,第二个进程进行的更新将丢失。

传统上,对共享变量的原子访问将由诸如信号量之类的机制控制。 与此类机制相比, fetch_and_addfetch_and_addlp 子例程几乎不需要增加处理器使用情况。

对于 32 位应用程序, fetch_and_add fetch_and_addlp 子例程完全相同,并且对单词对齐的单个单词 (在 4 字节边界上对齐的 32 位变量) 进行操作。

对于 64 位应用程序, fetch_and_add 子例程对单词 4 的单个单词进行操作 (在 4 字节边界上对齐的 32 位变量) ,而 fetch_and_addlp 子例程对双单词对齐的双单词 (在 8 字节边界上对齐的 64 位变量) 进行操作。

参数

描述
addr 指定要增大的变量的地址。
value 指定要添加到变量中的值。

返回值

此子例程返回变量的原始值。