我习惯于使用p线程mutext等(或boost等效项)来同步/保护对跨线程数据共享的访问。
最近,我不得不使用在某些地方使用atomics的代码来避免互斥锁的一些开销等等。为了这个问题的目的,我询问更多关于如何这样做的问题,而不是它是否值得这样做;)
代码是用GCC 4.4.7,iir和Linux86-64编译的.我经常碰到这样的呼叫:InterlockedCopy(variable)
的类型。
__sync_fetch_and_add(&(__var__), 0)现在,这似乎很符合法案,除了我有一个习惯,就是想使方法不修改一个成员是.常量。
因此,如果我使用的是一个"status“标志变量,目前是一个uint32_t (但我愿意更改类型或使用typedef sig_int_t等),并且我希望将其设置为一个线程中的某个枚举值,然后通过一个const访问器在另一个线程中读取它,我如何做到这一点而不使访问器非-const或使所访问的成员”可变“?
请原谅我的无知,但我在想: GCC有很多原子原语。包括前、后加、减、或等值,并原子地返回它们(包括完整的内存屏障)--为什么没有:
__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忽略了一个普通的、非变异的“获取”(),除非是,因为它显然不需要,因为它通过其他现有的手段是可以实现的。
发布于 2015-10-31 17:30:05
实际上,行__sync_fetch_and_add(&(__var__), 0)所做的事情与只获取变量略有不同。它获取缓存行的所有权。我不确定这是否有意,但这就是它的作用。因此,改变它将改变程序的语义。
尽管x86-64体系结构是严格有序的,所以您通常不需要担心除了编译器之外的内存重排序问题。
https://stackoverflow.com/questions/33447784
复制相似问题