在这个例子中,我假设我们在一个至少有两个物理内核的X86系统上,并且线程#1和#2运行在它自己的CPU内核上(真正的并行性):多线程和一致性模型
[initial state]
shared_memory_location = 0;
[thread #1]
shared_memory_location = 1;
signal();
[thread #2]
wait_for_signal();
print(shared_memory_location);
shared_memory_location
对线程#2的价值是什么?
这是我对这样的:它可能是要么0
或1
但X86的一致性模型保证了存储位置写入之后的任何读操作将读取新的值,而不管这个读发生在其CPU核心。
X86一致性模型将确保执行第二个线程的第二个物理内核不会从CPU内核专用高速缓存中获取无效值。 X86使这一点变得更加简单,但是并不能保证像ARM这样的其他系统会以这种方式行事。
如果您没有X86的一致性模型,您将如何确保线程#2在从线程#1发出信号时能够读取新值?
......或者更重要的是,你如何将一个值传给正在以正确方式等待信号的线程?
免责声明:我可能完全错误的X86一致性模型,请纠正我,如果我是!
我以前听说过记忆障碍,但你如何使用它们?你什么是路障?这只是一个编译器技巧? –
内存屏障或内存围栏通常用于禁止CPU对指令进行重新排序,它暴露在两个部分:半围栏和一个完整的围栏..这里描述的确是一个很大的话题,但您可以在内存中找到更具体的细节屏障[here](http://msdn.microsoft.com/en-us/library/ms686355(v = vs.85).aspx)和[here](http://en.wikipedia.org/wiki/Memory_barrier ) –
谢谢,我会读它们。 –