1

这是原子计数器的示例 但我认为它不安全。

代码:volatile int i;

int get_value()
{
   return i;
}

int set_value(int x)
{
   i = x;
}

我知道gcc atomic builtin,但我找不到 atomic set value 操作。

在我的代码中,我认为以这种方式安全地获取值,有必要吗?

inline uint64_t get_value()
{
    return __sync_fetch_and_add(&m_value, 0L);
}

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

4

1 回答 1

0

这取决于你所说的原子。如果您的意思是 get() 将始终返回传递给 set_value 的值,那么在几乎所有现代架构上答案都是肯定的。

示例:如果线程 1,使用从 1 到 10 的值调用 set_value 10 次,并且您让线程 2 打印 get_value 的返回值,您将只看到从 1 到 10 的值。什么值取决于很多事情,您可以获得10 次“10”或 10 次“1”,但没有 11

__sync_fetch_and_add 也可以工作,但在内存排序等方面提供了更多保证,但成本更高。

于 2013-05-30T23:37:04.270 回答