如何在无原子操作的情况下直接读取std::atomic_int64_t的值?
解决方案
在单线程写入且无并发写入的场景下,你可以安全地读取std::atomic_int64_t的底层值,无需额外的原子同步指令。以下是两种可行的实现方式:
方式一:使用宽松内存序的原子加载(推荐)
这是符合C++标准的最优方案。std::memory_order_relaxed会让编译器生成最轻量化的读取指令(通常就是普通内存读取,无内存屏障),既满足你“不使用额外原子指令”的需求,又避免了未定义行为。示例代码:
std::atomic_int64_t val; // 写入线程中的读取操作 int64_t read_val = val.load(std::memory_order_relaxed);
方式二:直接访问底层存储(谨慎使用)
如果你想彻底绕过原子操作封装,可通过reinterpret_cast直接读取内存地址。由于写入线程无并发写入,这种访问是安全的,但该方式依赖编译器对std::atomic的内存布局实现(主流编译器如GCC、Clang、MSVC对平凡类型的std::atomic均直接存储值),属于实现定义行为,兼容性不如第一种方式。示例代码:
std::atomic_int64_t val; // 写入线程中的读取操作 int64_t read_val = *reinterpret_cast<const int64_t*>(&val);
注意:优先选择第一种方案,它兼顾性能与标准合规性,不会引发潜在的兼容性问题。
内容的提问来源于stack exchange,提问作者Jason Lee
相关产品推荐
相关产品推荐

