原子操作 (Atomics)

Zig 通过内置函数提供原子操作,确保在并发环境中安全地访问共享内存,避免数据竞争。

内存顺序 (Memory Order)

原子操作接受一个 memory_order 参数,用于指定内存访问的顺序约束。常见的内存顺序包括:

  • .Relaxed: 最弱的排序,不提供任何跨线程的同步保证。
  • .Acquire: 读取操作后的内存访问不能重排到该读取之前。
  • .Release: 写入操作前的内存访问不能重排到该写入之后。
  • .AcqRel: 兼具 .Acquire.Release 的特性。
  • .SeqCst (Sequentially Consistent): 最强的排序,提供全局的总顺序。

内置原子函数

  • @atomicLoad(ptr, ordering): 原子加载 ptr 指向的值。

    var x: i32 = 0;
    const value = @atomicLoad(&x, .SeqCst);
  • @atomicStore(ptr, value, ordering): 原子存储 valueptr 指向的位置。

    var x: i32 = 0;
    @atomicStore(&x, 1, .SeqCst);
  • @atomicRmw(ptr, op, value, ordering) (Read-Modify-Write): 原子地读取 ptr 处的旧值,执行操作 op(如 add, sub, and, or, xor, xchg),然后写入新值。返回旧值。

    var counter: i32 = 0;
    const old_value = @atomicRmw(&counter, .Add, 1, .SeqCst);
  • @cmpxchgStrong(ptr, expected, new_value, success_ordering, failure_ordering) (Compare-Exchange Strong): 如果 ptr 处的值等于 expected,则原子地将 new_value 写入 ptr。返回一个包含旧值和操作是否成功的结构体。此版本在循环中更高效。

  • @cmpxchgWeak(ptr, expected, new_value, success_ordering, failure_ordering) (Compare-Exchange Weak): 类似于 cmpxchgStrong,但在某些平台上可能会虚假失败(spurious failure),通常用于循环中。

另请参阅: