我正在写一些代码,其中一个定时器递增一个全局变量,该变量维护我的内部系统滴答计数。还有其他API,如getCount()、addToSystemTick()、incrementSystemTick()。我正在尝试使用原子变量作为system_tick_counter。我的问题是,对于添加或获取变量,我应该执行什么内存顺序策略?
ktca8awb1#
您可以遵循<stdatomic.h>的约定,默认提供seq_cst,并让getCount_explicit(memory_order)允许传递调用者选择的内存顺序。但是对于系统节拍变量,relaxed可能比较合适,因为您可能不会将其用于线程之间的同步。如果您也使用这些计时器值作为序列号,则类似下面的代码可能会有意义:
<stdatomic.h>
seq_cst
getCount_explicit(memory_order)
relaxed
if (getCount_explicit(memory_order_acquire) >= x) read other things updated before that tick number
如果所有的修改都是原子RMW,那么它就形成了一个释放序列,我认为acq_rel增量可以给予必要的属性来保证安全,这完全取决于你的用例是否相关。
acq_rel
1条答案
按热度按时间ktca8awb1#
您可以遵循
<stdatomic.h>
的约定,默认提供seq_cst
,并让getCount_explicit(memory_order)
允许传递调用者选择的内存顺序。但是对于系统节拍变量,
relaxed
可能比较合适,因为您可能不会将其用于线程之间的同步。如果您也使用这些计时器值作为序列号,则类似下面的代码可能会有意义:
如果所有的修改都是原子RMW,那么它就形成了一个释放序列,我认为
acq_rel
增量可以给予必要的属性来保证安全,这完全取决于你的用例是否相关。