2011-08-20 42 views
4

在这个例子中,我假设我们在一个至少有两个物理内核的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的价值是什么?

这是我对这样的:它可能是要么01但X86的一致性模型保证了存储位置写入之后的任何读操作将读取新的值,而不管这个读发生在其CPU核心。

X86一致性模型将确保执行第二个线程的第二个物理内核不会从CPU内核专用高速缓存中获取无效值。 X86使这一点变得更加简单,但是并不能保证像ARM这样的其他系统会以这种方式行事。

如果您没有X86的一致性模型,您将如何确保线程#2在从线程#1发出信号时能够读取新值?

......或者更重要的是,你如何将一个值传给正在以正确方式等待信号的线程?

免责声明:我可能完全错误的X86一致性模型,请纠正我,如果我是!

回答

0

如果signal()wait_for_signal()方法调用内部内存屏障,那么情况你描述,因为内存屏障通话不会发生甚至ARM,数据刷新到在主存储器,而不是私人的核心缓存,即它会将数据刷新到主内存中,所以shared_memory_location将会是“volatile write”,并且它也会将数据刷新到wait_for_signal之后的主内存中,所以读取shared_memory_location将会是“volatile read”。

+0

我以前听说过记忆障碍,但你如何使用它们?你什么是路障?这只是一个编译器技巧? –

+0

内存屏障或内存围栏通常用于禁止CPU对指令进行重新排序,它暴露在两个部分:半围栏和一个完整的围栏..这里描述的确是一个很大的话题,但您可以在内存中找到更具体的细节屏障[here](http://msdn.microsoft.com/en-us/library/ms686355(v = vs.85).aspx)和[here](http://en.wikipedia.org/wiki/Memory_barrier ) –

+0

谢谢,我会读它们。 –