为避免高速缓存的一致性问题,IA64架构的CPU提供了一些相关指令
volatile read 易失读取,该指令从内存读取字节,然后使高速缓存的相应字节失效
volatile write 易失写入,该指令将高速缓存的值刷新到主存中
memory fence 内存栅栏,将高速缓存的字节刷新到主存中
在System.Threading.Thread中提供了这三个方法
Thread.VolatileRead(...)
Thread.VolatileWrite(...)
Thread.MemoryBarrier();

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

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

18    }

19}


在c#中,有了比较好的简化,他支持易失字段,只需要在字段前加上volatile
参见VolatileField类

 1internal sealed class VolatileField
 2{
 3    private volatile 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}

c#对易失操作的支持,volatile保证字段的所有读写操作实际上都是对内存的读取
其实易失操作并不是好的做法,在大部分时候,算法在访问字段时只需要很少的易失操作
比如a = a + a;//a是类中的一个字段,这里如果用易失操作,就很难让人接受
所以不论是Thread的VolatileRead和VolatileWrite,还是c#的volatile关键词,都不建议使用
而推荐使用互锁方法或更高层次的线程同步构造

posted on 2007-07-02 17:08  宝气狗  阅读(609)  评论(1)    收藏  举报