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

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

27得票3回答
mfence和asm volatile(“”:::“memory”)的区别

据我所了解,mfence是硬件内存屏障,而asm volatile ("" : : : "memory")是编译器屏障。但是,asm volatile ("" : : : "memory")能否替代mfence还存在疑惑。 我感到困惑的原因是这个链接。

26得票5回答
最快的内联汇编自旋锁

我正在用C++编写一个多线程应用程序,性能至关重要。在线程之间复制小结构时,我需要使用大量的锁定,因此我选择使用自旋锁。 我已经进行了一些研究和速度测试,并发现大多数实现的速度大致相同: Microsoft的CRITICAL_SECTION,SpinCount设置为1000,得分约为14...

26得票1回答
Java中的内存栅是用来做什么的?

在尝试理解Java SE 9中新增的SubmissionPublisher(OpenJDK 10源代码, Javadoc)类的实现时,我发现了一些之前不知道的VarHandle API调用: fullFence、acquireFence、releaseFence、loadLoadFence和...

25得票1回答
这些seqlock的实现哪些是正确的?

我正在研究Seqlock的实现。然而,我找到的所有来源都有不同的实现方法。 Linux内核 Linux内核是这样实现的: static inline unsigned __read_seqcount_begin(const seqcount_t *s) { unsigned re...

24得票3回答
x86上的竞态条件问题

能否有人解释一下这个语句:shared variables x = 0, y = 0 Core 1 Core 2 x = 1; y = 1; r1 = y; r2 = x; 在x86处理器上,怎么可能同时使r1 == 0和r2 == 0呢? 来源:Bart...

24得票4回答
内存屏障是CPU执行的指令还是仅仅是一个标记?

我试图理解什么是内存屏障。根据我目前所知,内存屏障(例如:mfence)用于防止指令在内存屏障之前或之后重新排序。以下是内存屏障的一个示例:instruction 1 instruction 2 instruction 3 mfence instruction 4 instruction 5 ...

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

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

23得票1回答
锁定 xchg 和 mfence 有相同的行为吗?

我想知道的是,从一个线程访问正在被其他线程突变(假定随机)的内存位置的角度来看,lock xchg是否会与mfence有类似的行为。 它保证我获得最新值吗?在其后执行的任何内存读取/写入指令中? 我的困惑原因是: “读取或写入无法与I / O指令,锁定指令或序列化指令重新排序。” -In...

22得票8回答
在单处理器上,内存重排序对其他线程是否可见?

现代CPU架构通常采用可以导致乱序执行的性能优化。在单线程应用程序中,可能会发生内存重排序,但对程序员来说,这是不可见的,就好像内存是按程序顺序访问的一样。而对于SMP,内存屏障则用于强制执行某种内存顺序。 我不确定的是,在单处理器的情况下多线程如何实现。考虑以下示例:当线程1运行时,对f的...