-
20-09-2019 - |
题
在以下代码样本,确实存的障碍 FuncA 需要确保最新的价值是阅读?
class Foo
{
DateTime m_bar;
void FuncA() // invoked by thread X
{
Thread.MemoryBarrier(); // is required?
Console.WriteLine(m_bar);
}
void FuncB() // invoked by thread Y
{
m_bar = DateTime.Now;
}
}
编辑:如果不是,我怎么能确保FuncA将宣读最近的价值?(我想要确保最近的价值实际上是存储在处理器的高速缓冲存储)[影响使用锁]
解决方案 5
这其实并不重要,因为在32位架构一个可以得到一个撕裂这样的情况下阅读
其他提示
看起来像一个大大的“不”给我。 Thread.MemoryBarrier()才会同步向上在于实现它的线程内的存储器的访问。
从MSDN:
执行当前线程以这样的方式不能重新排序指令存储器之前的呼叫到内存屏障存储器后执行访问的处理器访问随后的呼叫到内存屏障。
建议你存储日期时间作为蜱的数目(它是“长”类型,即Int64的),则可以很容易地从蜱变换(新的DateTime(蜱))和蜱(myDateTime.Ticks)。然后你可以使用Interlocked.Read阅读价值和Interlocked.Exchange写在快速无锁定操作价值。
是的,记忆屏障是必要的,这样可以获得最新的价值。
如果记忆屏障是不存在,那么这是可能的X线阅读的价值m_bar从其自己的高速缓冲线,同时,价值并没有写回到主存储器(更改已经使当地线Y)。你可以达到同样的效果,宣布该变量,如挥发性:
易失性的改性剂通常使用的一个领域是由多个线程访问没有使用锁定声明的序列化的访问。使用挥发性的修改确保了这一线索的最新价值的书面通过另外一个线程。
一个很好的切入关于该事项(也许是最好的)这是一个由乔达菲: 挥发性读和写,并及时性
一个存储器屏障确实INFACT同样的事情笏锁定确实保证场会得到其 从内存在进入锁和最新值退出锁之前写入到存储器中。结果 制作由读取或写入确保字段的值总是读取或写入内存,从来没有优化 它首先到CPU的缓存也可以通过使用volatile关键字来实现的。结果 除非原始积分类型和引用类型的DateTime不能在CPU缓存注册广告等等 不需要(不能)与挥发性关键字声明。