以下是atomic counter的示例 但我认为这是不安全的。
代码: volatile int i;
int get_value()
{
return i;
}
int set_value(int x)
{
i = x;
}
我知道gcc atomic builtin,但我找不到原子设定值操作。
在我的代码中,我认为以这种方式安全地获取值,是否有必要?
inline uint64_t get_value()
{
return __sync_fetch_and_add(&m_value, 0L);
}
我不知道如何设置原子值。
答案 0 :(得分:0)
这完全取决于你所谓的原子。如果你的意思是get()将始终返回传递给set_value的值,那么几乎所有现代架构的答案都是肯定的。
示例:如果线程1使用1到10的值调用set_value 10次,并且线程2打印了get_value的返回值,则只能看到1到10之间的值。事情,你可以得到10次" 10"或10次" 1",但没有11
__ sync_fetch_and_add也能正常工作,但在内存排序等方面做得更有保障,但价格要贵得多。