为避免高速缓存的一致性问题,IA64架构的CPU提供了一些相关指令
volatile read 易失读取,该指令从内存读取字节,然后使高速缓存的相应字节失效
volatile write 易失写入,该指令将高速缓存的值刷新到主存中
memory fence 内存栅栏,将高速缓存的字节刷新到主存中
在System.Threading.Thread中提供了这三个方法
Thread.VolatileRead(...)
Thread.VolatileWrite(...)
Thread.MemoryBarrier();
在c#中,有了比较好的简化,他支持易失字段,只需要在字段前加上volatile
参见VolatileField类
c#对易失操作的支持,volatile保证字段的所有读写操作实际上都是对内存的读取
其实易失操作并不是好的做法,在大部分时候,算法在访问字段时只需要很少的易失操作
比如a = a + a;//a是类中的一个字段,这里如果用易失操作,就很难让人接受
所以不论是Thread的VolatileRead和VolatileWrite,还是c#的volatile关键词,都不建议使用
而推荐使用互锁方法或更高层次的线程同步构造
volatile read 易失读取,该指令从内存读取字节,然后使高速缓存的相应字节失效
volatile write 易失写入,该指令将高速缓存的值刷新到主存中
memory fence 内存栅栏,将高速缓存的字节刷新到主存中
在System.Threading.Thread中提供了这三个方法
Thread.VolatileRead(...)
Thread.VolatileWrite(...)
Thread.MemoryBarrier();
1
internal 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
}
internal sealed class VolatileMethod2
{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类
1
internal 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
}
internal sealed class VolatileField2
{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关键词,都不建议使用
而推荐使用互锁方法或更高层次的线程同步构造


浙公网安备 33010602011771号