7得票1回答
减少总线流量以进行缓存行失效处理

共享内存多处理系统通常需要为缓存一致性生成大量的流量。 核心A写入缓存。稍后,核心B可能会读取相同的内存位置。因此,即使核心A本来可以避免将数据写入主内存,但需要向核心B发送通知,告诉B如果它在缓存中持有该地址,则使其失效。 确切地说,何时需要执行此操作是个复杂的问题。不同的CPU架构具有不...

8得票2回答
编译器障碍的目的是什么?

以下内容摘自《Windows并发编程》,第10章第528~529页,一份C++模板双重检查实现。 T getValue(){ if (!m_pValue){ EnterCriticalSection(&m_crst); if (! m_pVal...

10得票1回答
C++中关于原子加载存储的优化

我已经阅读了C++中的std::memory_order,并且部分理解了它。但是我仍然对它有一些疑问。 std::memory_order_acquire的说明称,在此加载之前,当前线程中的任何读取或写入都不会被重新排序。这是否意味着编译器和CPU不允许将acquire语句下面的任何指令移...

7得票4回答
C++原子性:函数调用是否起到内存屏障的作用?

我正在阅读这篇文章《编译时的内存排序》,其中提到: 事实上,大多数函数调用都充当编译器屏障,无论它们是否包含自己的编译器屏障。这不包括内联函数、带有 pure 属性声明的函数以及使用链接时代码生成的情况。除了这些情况外,对外部函数的调用甚至比编译器屏障更强,因为编译器不知道函数的副作用是什...

14得票5回答
当链接构造函数时,JVM的隐式内存屏障会如何表现?

关于我之前的问题有关未完全构建的对象, 我有第二个问题。就像Jon Skeet所指出的,构造函数末尾存在一个隐式的内存屏障,确保所有线程都能看到final字段。但是如果一个构造函数调用另一个构造函数,每个构造函数的结束处是否都有这样的内存屏障,还是只有在最开始被调用的那个构造函数的结尾处才有呢...

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

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

37得票2回答
x86 上的加载和存储的原子性

8.1.2 总线锁定 Intel 64和IA-32处理器提供了一个LOCK#信号,它在某些关键的内存操作期间自动被激活,以锁定系统总线或等效链路。当此输出信号被激活时,来自其他处理器或总线代理的对总线控制的请求将被阻塞。软件可以通过在指令前加上LOCK前缀来指定其他需要遵循LOCK语义的场合。...

27得票1回答
内存屏障和TLB

内存屏障保证数据缓存的一致性。但是,它是否保证TLB的一致性? 我遇到了一个问题,即JVM(java 7 update 1)在线程之间传递MappedByteBuffer时有时会因内存错误(SIGBUS,SIGSEG)而崩溃。 例如:final AtomicReference<Mappe...

23得票1回答
英译中:Intel 内存模型是否使得 SFENCE 和 LFENCE 变得多余?

英特尔内存模型保证: 存储操作不会与其他存储操作重排序 加载操作不会与其他加载操作重排序 http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/ 我曾经看到过有人声称在x86-64上SFEN...

70得票2回答
如何理解读内存屏障和volatile?

有些语言提供了volatile修饰符,它被描述为在读取支持变量的内存之前执行"读内存屏障"。 读内存屏障通常被描述为确保CPU在执行屏障之前已经执行了所请求的读取操作,然后才执行屏障之后请求的读取操作。然而,使用这个定义,似乎仍然可能读取到旧值。换句话说,在特定顺序下进行读取并不意味着必须查...