C语言中系统Tick计数器原子变量的内存序策略选择咨询
原子变量system_tick_counter的内存序选择策略
针对你描述的系统Tick计数场景,内存序的选择核心取决于是否需要同步其他共享内存操作,以下是具体方案:
核心结论
如果这个计数器仅用于独立维护系统Tick,没有和其他共享变量的依赖同步需求(比如不会在修改计数器后,要求其他线程读取计数器时能看到另一个变量的更新),所有操作都可以使用memory_order_relaxed——这是最轻量的内存序,既能保证操作的原子性,又不会带来额外的同步开销。
各API的具体实现示例(以C++为例)
#include <atomic> std::atomic<uint64_t> system_tick_counter{0}; // 定时器触发的Tick自增 void incrementSystemTick() { system_tick_counter.fetch_add(1, std::memory_order_relaxed); } // 向Tick计数器添加指定值 void addToSystemTick(uint64_t delta) { system_tick_counter.fetch_add(delta, std::memory_order_relaxed); } // 获取当前Tick计数 uint64_t getCount() { return system_tick_counter.load(std::memory_order_relaxed); }
为什么选relaxed?
- 原子性足够:relaxed内存序已经保证了计数器的读写/自增/加法操作是原子的,不会出现多个线程操作导致的中间值泄露(比如读取到半更新的计数)。
- 无额外同步开销:更强的内存序(如acquire/release、seq_cst)会引入缓存同步指令,带来性能损耗,但你的场景中不需要同步其他内存位置,完全没必要。
什么时候需要更强的内存序?
如果后续扩展中出现了跨内存位置的同步需求,比如:
- 线程A修改计数器后,紧接着修改了另一个共享变量,要求线程B读取计数器时必须看到这个变量的更新
这时候需要调整内存序: - 修改操作(increment/add)使用
memory_order_release - 读取操作(getCount)使用
memory_order_acquire
这种场景下,release操作会保证之前的内存修改对后续acquire该计数器的线程可见,实现跨线程的内存同步。
内容的提问来源于stack exchange,提问作者Priyank Pandya
相关产品推荐
相关产品推荐

