18得票2回答
锁语句的内存屏障

最近我了解了关于内存屏障和重排序问题的知识,现在我对此有些困惑。 考虑以下情况:private object _object1 = null; private object _object2 = null; private bool _usingObject1 = false; p...

18得票2回答
.NET中变量新鲜度保证(volatile vs. volatile read)

我已经阅读了许多关于volatile和VolatileRead(ReadAcquireFence)的相互矛盾的信息(来自msdn、SO等等)。 我理解它们的内存访问重新排序限制意义,但我仍然完全困惑于新鲜度保证,这对我非常重要。 msdn文档中关于volatile的说明提到: (....

17得票3回答
为什么SFENCE + LFENCE是否等同于MFENCE?

我们知道从之前回答的问题中(处理器x86/x86_64中指令LFENCE有任何意义吗?),我们不能使用SFENCE代替MFENCE来提供顺序一致性。 那里的一个答案表明MFENCE= SFENCE+LFENCE,也就是说,LFENCE会做一些事情,没有它我们无法提供顺序一致性。 LFENC...

17得票5回答
线程同步。锁是如何使对内存的访问“正确”的?

首先,我知道lock{}是Monitor类的语法糖。(哦,是语法糖) 我正在尝试解决一些简单的多线程问题,发现无法完全理解如何通过锁定某个随意的内存单元来保护其他整个内存不会被缓存到寄存器/CPU缓存等中。使用代码示例更容易解释我所说的内容:for (int i = 0; i < 10...

16得票3回答
在使用原子引用计数共享不可变数据时,是否需要内存屏障?

我有一些不可变数据结构,希望使用引用计数来管理它们,在SMP系统上跨线程共享。 这是释放代码的样子:void avocado_release(struct avocado *p) { if (atomic_dec(p->refcount) == 0) { fre...

16得票1回答
无锁队列中的内存屏障使用

我最近阅读了Paul McKenney在2010年撰写的白皮书,"Memory Barriers: a Hardware View for Software Hackers"。 关于下面给出的一小段C代码,实现了M&S队列入队函数,特别是关于内存和编译器屏障,我非常希望得到一些反馈/...

16得票3回答
在OpenCL中,与barrier()相比,mem_fence()有什么作用?

与我理解的barrier()不同,mem_fence()不会影响工作组中的所有项。OpenCL规范在第6.11.10节中表示,对于mem_fence(): 指令执行内存读写。 (因此它适用于一个单独的工作项)。 但是,在3.3.1节中同时表示: 在工作项内存中具有加载/存储一致性...

16得票1回答
Intel的SFENCE指令具有发布语义吗?

似乎 "Acquire" 和 "Release" 语义的公认定义是这样的: (摘自 http://msdn.microsoft.com/en-us/library/windows/hardware/ff540496(v=vs.85).aspx) 一个操作具有“acquire”语义,如果其他处...

16得票2回答
在x86架构中,如何使用MOV实现release-and-acquire(释放-获取)?

这个问题是对以下内容的跟进/澄清: MOV x86指令是否实现了C++11的memory_order_release原子存储? 这表明MOV汇编指令足以在x86上执行acquire-release语义。我们不需要LOCK、栅栏或xchg等。然而,我很难理解这是如何工作的。 英特尔文档Vo...

16得票4回答
如何在C++11中实现一个StoreLoad屏障?

我想编写可移植的代码(适用于Intel、ARM、PowerPC等平台),解决一个经典问题的变体:Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something }...