c#多线程同步1-原子操作
多线程共享全局变量(会发生什么)
static int sum = 0;
static void func(object state)
{
for (int i = 0; i < 1000000; i++)
{
sum += i;
}
AutoResetEvent autoEvent = (AutoResetEvent)state;
autoEvent.Set(); // 向WaitHandle.WaitAll 一个线程执行完毕
}
static void Main(string[] args)
{
int threadCount = 4;
//分别打印5次 4个线程并行计算sum的值
for (int index = 0; index < 5; index++)
{
WaitHandle[] waitHandle = new WaitHandle[threadCount];
for (int i = 0; i < threadCount; i++)
{
waitHandle[i] = new AutoResetEvent(false);
new Thread(new ParameterizedThreadStart(func)).Start(waitHandle[i]); //开启线程
}
//等待4线程执行结束
WaitHandle.WaitAll(waitHandle);
Console.WriteLine($"index={index+1} sum={sum}");
sum = 0; //让sum清零
}
Console.ReadKey();
}

结论:多个线程同时操作一个变量,计算的结果并不是我们想要的.如何才能高效得出我们想要的结果呢?
使用原子操作(使用很简单)
static int sum = 0;
static void func(object state)
{
for (int i = 0; i < 1000000; i++)
{
//Interlocked.Increment(ref sum); //以原子操作递增1
Interlocked.Add(ref sum, 1); //以原子操作递增指定的值,这里加1
}
AutoResetEvent autoEvent = (AutoResetEvent)state;
autoEvent.Set(); // 向WaitHandle.WaitAll 一个线程执行完毕
}
static void Main(string[] args)
{
int threadCount = 4;
//分别打印5次 4个线程并行计算sum的值
for (int index = 0; index < 5; index++)
{
WaitHandle[] waitHandle = new WaitHandle[threadCount];
for (int i = 0; i < threadCount; i++)
{
waitHandle[i] = new AutoResetEvent(false);
new Thread(new ParameterizedThreadStart(func)).Start(waitHandle[i]); //开启线程
}
//等待4线程执行结束
WaitHandle.WaitAll(waitHandle);
Console.WriteLine($"index={index+1} sum={sum}");
sum = 0; //让sum清零
}
Console.ReadKey();
}
秋风
2016-12-25