原子操作 (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): 原子存储value到ptr指向的位置。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),通常用于循环中。
另请参阅:
- Builtin Functions (内置函数)
- Async Functions (异步函数)