2、Interlocked
为多线程提供原子操作。
在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤:
1、将实例变量中的值加载到寄存器中。
2、增加或减少该值。
3、在实例变量中存储该值。(来自MSDN)
原子操作保证了在执行以上三步操作期间不会有其他线程改变变量的值。
上面代码的 Interlocked实现
class Program
{
private static int Flag = 0;
static void Main(string[] args)
{
CompareExchange();
}
static void CompareExchange()
{
for (int i = 0; i < 4; i++)
{
Thread tr = new Thread(doing);
tr.Start(i);
}
Console.Read();
}
static void doing(object threadName)
{
//判断Flag值为0则线程可以进入。
while (Interlocked.CompareExchange(ref Flag, 1, 0) != 0)
{
Thread.Sleep(500);
}
int i = 0;
while (i < 10)
{
Thread.Sleep(100);
Console.WriteLine(threadName + " " + i++);
}
Console.WriteLine(threadName + "over ");
//还原Flag值为0
Interlocked.CompareExchange(ref Flag, 0, 1);
}
}
{
private static int Flag = 0;
static void Main(string[] args)
{
CompareExchange();
}
static void CompareExchange()
{
for (int i = 0; i < 4; i++)
{
Thread tr = new Thread(doing);
tr.Start(i);
}
Console.Read();
}
static void doing(object threadName)
{
//判断Flag值为0则线程可以进入。
while (Interlocked.CompareExchange(ref Flag, 1, 0) != 0)
{
Thread.Sleep(500);
}
int i = 0;
while (i < 10)
{
Thread.Sleep(100);
Console.WriteLine(threadName + " " + i++);
}
Console.WriteLine(threadName + "over ");
//还原Flag值为0
Interlocked.CompareExchange(ref Flag, 0, 1);
}
}