15得票5回答
为什么标准的C#事件调用模式在没有内存屏障或缓存失效的情况下是线程安全的?类似的代码呢?

在C#中,这是以线程安全的方式调用事件的标准代码:var handler = SomethingHappened; if(handler != null) handler(this, e); 在另一个可能是不同线程上的地方,编译器生成的 "add" 方法使用 Delegate.Comb...

15得票2回答
装载和存储指令是唯一会被重新排序的指令吗?

我已经阅读了许多关于内存顺序的文章,它们都只提到CPU会重新排列load和store指令。 CPU(我特别关注x86 CPU)是否只会重新排列load和store指令,而不会重新排列其他指令?

15得票1回答
为什么在其他逻辑处理器引起内存顺序违规时需要清空流水线?

Memory Order Machine Clear性能事件在vTune文档中描述为: 当来自另一个处理器的嗅探请求与流水线中数据操作的源匹配时,发生内存排序(MO)机器清除。在这种情况下,在进行中的加载和存储被退役之前,流水线被清除。 然而,我不明白为什么会这样。在不同逻辑处理器上...

15得票3回答
共享内存的原子访问

我有一个被多个进程共享的内存,这些进程以某种特定方式解释这块内存。DataBlock { int counter; double value1; double ... } 我想要的是计数器在原子级别上进行更新/递增,同时在该地址上进行内存释放操作。 例如,如果我没有使用共享内存,那么就会...

15得票3回答
内存屏障与互锁对内存缓存一致性时间的影响

简化问题: 使用Interlocked操作和Memory barriers引起的内存缓存一致性(或“刷新”)的时间是否有区别?让我们考虑在C#中使用任何Interlocked操作与Thread.MemoryBarrier()。我相信有所不同。 背景: 我阅读了很多关于内存屏障的信息 - ...

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

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

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

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

14得票1回答
x86 CPU 会重排指令吗?

我了解到一些CPU会重新排序指令,但对于单线程程序来说这并不是问题(指令仍将被重新排序,但看起来就像指令是按顺序执行的),只有对于多线程程序才是问题。 为了解决指令重新排序的问题,我们可以在代码中适当的位置插入内存屏障。 但x86 CPU是否会重新排序指令呢?如果它不会重新排序,则无需使用...

14得票1回答
如果我不使用屏障,一个核心需要多长时间才能看到另一个核心的写入?

我一直在谷歌上搜索我的问题,但是我真的不知道如何简洁地陈述这个问题。 假设我有两个线程在多核英特尔系统上运行。这些线程正在同一NUMA节点上运行。假设线程1只写入X一次,然后只会偶尔读取它。进一步假设,除其他事项外,线程2连续读取X。如果我不使用内存栅栏,线程1写入X后,线程2看到更新后的值...

14得票4回答
Java多线程下原始数组写入的可见性问题

我最近在我的代码库中发现了这个珍宝:/** This class is used to "publish" changes to a non-volatile variable. * * Access to non-volatile and volatile varia...