如何在CONST方法中访问类似于GCC的sync_fetch_and_add的32位或64位整数值?

时间:2015-10-31 03:36:51

标签: c++ caching atomicity

我习惯使用pthread mutexts等(或者提升等价物)来同步/保护对线程数据共享的访问。

最近,我不得不处理代码中使用原子的地方,以避免互斥锁定的一些开销。我为了这个问题的目的,更多地询问如何做而不是是否值得做;)

代码是使用GCC 4.4.7,iir和Linux x86-64编译的。 我经常遇到这种类型的电话:InterlockedCopy(variable)

是typedef'ed

__sync_fetch_and_add(&(__var__), 0)

现在,这似乎很适合这个法案,除了我有这个习惯,想要制作不修改成员的方法是...... const。

所以,如果我有一个我使用的“status”标志变量,目前是uint32_t(但我愿意更改类型或使用typedef sig_int_t等)并且我希望在一个线程中将其设置为某个枚举值并读取它在另一个通过const访问器,如何在不使访问者非const或使被访问的成员“可变”的情况下这样做?

请原谅我的无知,但我在想:GCC有很多原子基元。包括在pre或post之前或之后添加,减去和,或等等值并以原子方式返回它们(包含完整的内存屏障) - 为什么没有:

__sync_fetch(__var__) built-in.

是因为不需要它。我们可以简单地使用普通的uint32_t和:

T1(CPU0): __sync_synchronize(); statusFlag = ENUM_VALUE;

T2(CPU1): if (statusFlag == ENUM_VALUE)
          { // do stuff ... }
          __sync_synchronize();

或者某些 - 这样: 1.确保正确对齐的整数变量的原子访问。 2.确保在一个线程中更新标志时,在另一个线程中检查此标志(不在循环中)的方法将在下一次检查另一个线程中的该标志时看到它(允许时间为一致性) '东西'我试图了解 - 发生......)

(很难以非交互方式输入这个问题;) - 抱歉)

主要是,我无法想象GCC会遗漏一个简单的非变异“获取”,除非是因为它显然不需要,因为它可以通过其他现有手段轻而易举地实现。

1 个答案:

答案 0 :(得分:1)

__sync_fetch_and_add(&(__var__), 0)实际上做的事情与获取变量略有不同。它拥有缓存行的所有权。我不确定这是否有意,但这就是它的作用。因此,更改它将改变程序的语义。

x86-64架构虽然有很强的排序,但你通常不需要担心编译器以外的内存重新排序。