原子操作是C++多线程中保障单变量原子性读写的机制,通过std::atomic实现无锁线程安全;支持隐式/显式内存序、compare_exchange及atomic_flag等,但不适用于多变量协同或浮点复合运算。
原子操作是C++多线程编程中保证变量读写不被中断、避免数据竞争的核心机制。用好std::atomic,不需要锁也能实现线程安全的简单共享变量访问。
把普通类型换成对应原子类型即可,比如int → std::atomic_int,或更通用的std::atomic:
std::atomic counter{0}; —— 值初始化为0,支持所有基本整型、指针、以及满足 trivially copyable 的自定义类型(需额外注意对齐和大小限制)auto x = counter;会调用隐式转换,实际是load());也不能传给需要非const引用的函数std::atomic模板,比内置别名(如atomic_int)更清晰、可移植性更好最常用的是隐式操作:counter++、counter.load()、counter.store(42)、counter.exchange(100)。它们默认使用std::memory_order_seq_cst(顺序一致性),最安全也稍慢。
counter.fetch_add(1, std::m
emory_order_relaxed)(仅保证原子性,不约束前后指令重排)relaxed常够用;涉及状态协同(如生产者-消费者)时,常用acquire/release
compare_exchange_weak和compare_exchange_strong是实现无锁结构的基础,用于“比较并交换”:
int expected = counter.load(); do { /* 修改expected */ } while (!counter.compare_exchange_weak(expected, new_value));
weak可能虚假失败(spuriously fail),适合循环重试;strong不虚假失败,但某些平台开销略大std::atomic_flag,只支持test_and_set()和clear(),是唯一保证无锁(lock-free)的原子类型,适合实现自旋锁原子类型不是万能锁替代品:
fetch_add等复合操作(C++20起部分编译器扩展支持,但非标准)is_lock_free()检查是否真正无锁(尤其在结构体上),否则底层可能用互斥量模拟,失去性能优势&counter非法),也不支持sizeof以外的指针运算基本上就这些。用对场景、选对内存序、避开多变量耦合——原子操作就能既安全又高效。