惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

博客园 - 宝气狗

【摄影】2008年06月07日西塘 【摄影】2008年05月24日大明山 2007年11月——感受黄山,天下无山。 将基础数据类型与字节数组相互转换 托管/非托管类型对照 【数据库】遍历XML根下的一级节点 - 宝气狗 - 博客园 Enterprise Library中缓存过期策略探究 css中的nowrap 2007年9月15日 九溪-五云山-梅家坞之行 宝气狗的新闻博开始使用http://webbased.cn [设计模式] 15.Command 命令模式 [设计模式] 22.State 状态模式 [设计模式] 23.Strategy 策略模式 值类型装箱拆箱需要注意的地方 CLR如何控制类型中字段的布局 MSIL指令速查 内存一致性问题(续一) 如何循序渐进向DotNet架构师发展 关于将Queue中的数据拼接成xml的经验
内存一致性问题
宝气狗 · 2007-07-02 · via 博客园 - 宝气狗

拜读了Richter先生关于内存一致性问题的论文,分析的很透彻,这里做一下自己的小结。
示例代码:

 1internal sealed class CacheCoherencyProblem
 2{
 3    private Byte m_initialized = 0;
 4    private Int32 m_value = 0;
 5
 6    public void Thread1()
 7    {
 8        m_value = 5;
 9        m_initialized = 1;
10    }

11
12    public void Thread2()
13    {
14        if (m_initialized == 1)
15        {
16            Console.Write(m_value);
17        }

18    }

19}

在多CPU或多内核CPU机器中,因CPU高速缓存机制,而产生内存不一致现象
假设在一个多CPU的机器上创建了该实例:
CPU1执行Thread1方法,CPU2执行Thread2方法,假定程序的执行顺序为:
1.CPU2的线程在读取某个字节时,m_value字段的字节刚好位于这个字节之前,
  根据CPU高速缓存机制,m_value被预读到CPU高速缓存中(因为应用程序通常
  读取的字节在内存中彼此互邻,这样可以提升性能)
2.CPU1执行Thread1,将m_value改为5,但根据CPU高速缓存机制,改变仅暂时
  存在于CPU1的高速缓存中,直到某个时间才会刷新到内存中。我们这里假设
  此步操作可能需要经过很久才会反映到内存中
3.CPU1继续执行Thread1方法,同样在自己的高速缓存中,修改了m_initialized
  的值为1。但这次的m_initialized却处在CPU1高速缓存的不同区段,结果
  是很快被刷新到内存中了。
4.CPU2开始执行Thread2方法,当访问m_initialized值时,CPU2会因高速缓存中
  不存在m_initialized而去读取内存,结果是CPU2读取到m_initialized=1,随即
  进入了if语句块。
5.CPU2继续执行Thread2方法,此时CPU2同样也会因高速缓存中不存在m_value而
  去内存中取值,但因为CPU1还没有将自己的m_value=5更新到内存,所以CPU2取到
  了m_value=0