int v = n;这是gcc中的原子吗?

时间:2013-05-13 09:38:38

标签: gcc thread-safety atomic

以下是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);
}

我不知道如何设置原子值。

1 个答案:

答案 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也能正常工作,但在内存排序等方面做得更有保障,但价格要贵得多。