fetch_and_add 和 fetch_and_addlp 子例程
用途
以原子方式更新变量。
库
标准 C 库 (libc.a)
语法
描述
fetch_and_add 和 fetch_and_addlp 子例程在单个原子操作中递增一个单词。 当在多个线程或进程之间共享计数器变量时,此操作很有用。 更新此类计数器变量时,确保访存,更新和存储操作以原子方式发生 (不可中断) ,这一点很重要。 例如,考虑在操作可中断的情况下可能发生的事件的顺序:
- 进程会访存计数器值并向其添加一个值。
- 第二个进程访存计数器值,添加一个值并存储该值。
- 第一个进程存储其值。
这样做的结果是,第二个进程进行的更新将丢失。
传统上,对共享变量的原子访问将由诸如信号量之类的机制控制。 与此类机制相比, fetch_and_add 和 fetch_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 | 指定要添加到变量中的值。 |
返回值
此子例程返回变量的原始值。