15得票1回答
流行的“易失性轮询标志”模式是否存在问题?

假设我想在线程之间使用布尔状态标志进行协作取消。 (我意识到最好使用CancellationTokenSource; 这不是这个问题的重点。) private volatile bool _stopping; public void Start() { var thread = n...

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

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

19得票5回答
这是使用Thread.MemoryBarrier()的正确方式吗?

假设我有一个控制某个循环执行的字段:private static bool shouldRun = true; 我有一个正在运行的线程,其中有如下代码:while(shouldRun) { // Do some work .... Thread.MemoryBarrier()...

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

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

10得票3回答
内存屏障是否强制缓存一致性?

我正在阅读这个关于使用bool进行线程控制的问题,被@eran所回答的内容所吸引: 只有在单核处理器上,所有线程都使用相同的缓存时,使用volatile就足够了。在多核处理器上,如果一个核心上调用stop(),而另一个核心上执行run(),那么CPU缓存同步可能需要一段时间,这意味着两个核...

7得票1回答
在x86上的比较与交换为什么是一个完全屏障?

根据这个问题的答案,似乎在x86上,LOCK CMPXCHG实际上会导致完整的屏障。可以推测,在底层,Unsafe.compareAndSwapInt()也会生成这种效果。我很难理解为什么会这样:使用MESI协议之后,更新了缓存行之后,CPU是否只能使其他核心失效那个缓存行,而不是排空执行CA...

7得票1回答
如果没有非临时指令,那么 `xchg` 包含 `mfence` 吗?

我已经看过这个答案和这个答案,但是两者都没有明确说明在没有非临时指令的情况下mfence和xchg的等价性或非等价性。 Intel xchg指令的文档提到:“此指令对于实现进程同步的信号量或类似数据结构非常有用”,并进一步引用了第8章Volume 3A。该参考文献陈述如下: “对于P6系列...

13得票2回答
C++0x 中的栅栏,仅对原子操作或内存总体提供保障。

C++0x draft 中有一个与 CPU/芯片级别的栅栏非常不同的概念,或者说是 Linux 内核开发人员对 栅栏 的期望。问题是草案是否真的意味着极其受限制的模型,还是措辞只是贫乏,并且实际上意味着真正的栅栏。 例如,在 29.8 栅栏 下,它声明了以下内容: 如果存在原子操作 X ...

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

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

11得票1回答
为什么GCC使用mov/mfence而不是xchg来实现C11的atomic_store?

在C++ and Beyond 2012:Herb Sutter - atomic<> Weapons,第2部分中,Herb Sutter(约在0:38:20左右)认为应该使用xchg而不是mov/mfence来实现x86上的atomic_store。他似乎还暗示这个特定的指令序列...