fetch_and_and , fetch_and_or , fetch_and_andlp 和 fetch_and_orlp 子例程

用途

以原子方式设置或清除变量中的位。

标准 C 库 (libc.a)

语法

#include <sys/atomic_op.h>
uint fetch_and_and (  addr, mask)
atomic_p addr;
unit mask;

ulong fetch_and_andlp ( addr, mask)
atomic_l addr;
ulong mask;

uint fetch_and_or (  addr,mask)
atomic_p addr;
intunit mask;

ulong fetch_and_orlp ( addr, mask)
atomic_l addr;
ulong mask;

描述

根据位 面具fetch_and_andfetch_and_andlpfetch_and_orfetch_and_orlp 子例程分别清除并设置变量中的位,作为单个原子操作。

fetch_and_andfetch_and_andlp 子例程在变量中清除对应于位掩码中的清除位的位。

fetch_and_orfetch_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_addlpfetch_and_orlp 子例程对双字对齐的双字 (在 8 字节 8 上对齐的 64 位变量) 进行操作。

当包含位标志的变量在多个线程或进程之间共享时,这些操作很有用。 在更新此类变量时,重要的是访存,位清除或设置以及存储操作以原子方式发生 (不可中断)。 例如,考虑在操作可中断的情况下可能发生的事件的顺序:

  1. 一个进程访存 flags 变量并在其中设置位。
  2. 第二个进程访存标志变量,设置另一个位并存储它。
  3. 第一个进程存储其值。

结果是第二个过程所做的更新将丢失。

传统上,对共享变量的原子访问将由诸如信号量之类的机制控制。 与此类机制相比, fetch_and_andfetch_and_andlpfetch_and_orfetch_and_orlp 子例程所需要的开销很少。

参数

描述
addr 指定要将其位清除或设置的变量的地址。
mask 指定要应用到变量的位掩码。

返回值

这些子例程将返回变量的原始值。