fetch_and_and , fetch_and_or , fetch_and_andlp 和 fetch_and_orlp 子例程
用途
以原子方式设置或清除变量中的位。
库
标准 C 库 (libc.a)
语法
描述
根据位 面具, fetch_and_and, fetch_and_andlp, fetch_and_or和 fetch_and_orlp 子例程分别清除并设置变量中的位,作为单个原子操作。
fetch_and_and 和 fetch_and_andlp 子例程在变量中清除对应于位掩码中的清除位的位。
fetch_and_or 和 fetch_and_orlp 子例程在变量中设置对应于位掩码中的设置位的位。
对于 32 位应用程序, fetch_and_and 和 fetch_and_andlp 子例程完全相同,并且对单词对齐的单个单词 (在 4 字节边界上对齐的 32 位变量) 进行操作。 fetch_and_or 和 fetch_and_orlp 子例程完全相同,并且作用于单词对齐的单个单词 (32 位变量在 4 字节的边界上对齐)。
对于 64 位应用程序, fetch_and_and 和 fetch_and_or 对单词对齐的单个单词 (在 4 字节 4 上对齐的 32 位变量) 执行操作。 fetch_and_addlp 和 fetch_and_orlp 子例程对双字对齐的双字 (在 8 字节 8 上对齐的 64 位变量) 进行操作。
当包含位标志的变量在多个线程或进程之间共享时,这些操作很有用。 在更新此类变量时,重要的是访存,位清除或设置以及存储操作以原子方式发生 (不可中断)。 例如,考虑在操作可中断的情况下可能发生的事件的顺序:
- 一个进程访存 flags 变量并在其中设置位。
- 第二个进程访存标志变量,设置另一个位并存储它。
- 第一个进程存储其值。
结果是第二个过程所做的更新将丢失。
传统上,对共享变量的原子访问将由诸如信号量之类的机制控制。 与此类机制相比, fetch_and_and, fetch_and_andlp, fetch_and_or和 fetch_and_orlp 子例程所需要的开销很少。
参数
| 项 | 描述 |
|---|---|
| addr | 指定要将其位清除或设置的变量的地址。 |
| mask | 指定要应用到变量的位掩码。 |
返回值
这些子例程将返回变量的原始值。