73得票4回答
函数调用在现代平台上是否是有效的内存屏障?

在我审查的代码库中,我发现了以下用法。void notify(struct actor_t act) { write(act.pipe, "M", 1); } // thread A sending data to thread B void send(byte *data) { ...

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

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

59得票2回答
在x86/x86_64处理器上使用LFENCE指令有意义吗?

在互联网上经常看到说x86处理器中的LFENCE无意义,即它什么也不做,所以我们可以代替使用MFENCE来绝对无痛地使用SFENCE,因为MFENCE=SFENCE+LFENCE=SFENCE+NOP=SFENCE。 但是,如果LFENCE没有意义,那么为什么我们有四种方法在x86/x86_...

55得票6回答
为什么我们需要使用Thread.MemoryBarrier()?

在《C# 4 in a Nutshell》一书中,作者展示了这个类有时可以写入0,而不需要MemoryBarrier,但我在我的Core2Duo上无法复现。public class Foo { int _answer; bool _complete; public vo...

52得票7回答
互斥锁函数在没有volatile的情况下是否足够?

我和同事开发了适用于各种平台的软件,这些平台运行在x86、x64、Itanium、PowerPC和其他10年前的服务器CPU上。 我们刚刚讨论了诸如pthread_mutex_lock() ... pthread_mutex_unlock()这样的互斥函数是否足够,或者是否需要使用volat...

40得票2回答
为什么我需要内存屏障?

C# 4入门经典(强烈推荐)使用以下代码演示MemoryBarrier的概念(假设A和B在不同的线程上运行):class Foo{ int _answer; bool complete; void A(){ _answer = 123; Thread.MemoryB...

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

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

36得票2回答
Java中内存屏障的行为

阅读了更多的博客/文章等后,我对内存屏障前/后的加载/存储行为感到非常困惑。 以下是Doug Lea在他关于JMM的澄清文章中的两个引用,它们都非常直观: 当线程A写入volatile字段f时可见的任何内容,当线程B读取f时变得可见。 请注意,为了正确建立happens-before关系...

36得票2回答
什么时候使用仅编译器内存屏障(例如std::atomic_signal_fence)是有用的?

当我阅读关于内存模型、屏障、顺序、原子操作等相关内容时,经常会遇到“编译器栅栏”的概念,但通常它都是与“CPU栅栏”配对使用的。 然而,偶尔我也会看到一些仅适用于编译器的栅栏结构。例如C++11中的std::atomic_signal_fence函数,cppreference.com上指出:...

32得票3回答
Can atomics suffer spurious stores?

在C++中,原子操作是否会出现虚假存储? 例如,假设m和n是原子变量,并且初始时m = 5。在线程1中, m += 2; 在第二个线程中, n = m; 结果:变量n的最终值应该是5或7,对吗?但它会不会误报为6?它会不会误报为4或8,甚至其他值? 换句话说,C...