我有一个简单的类,旨在解决线程问题。它有一个成员变量num,它被初始化为0,还有一个名为modify的方法,它递增然后递减num次。当程序运行时,它会创建两个运行修改的线程,然后启动一个计时器并启动线程。它使用while循环等待两个线程完成执行,然后停止计时器并将经过的时间打印到控制台。上课:
public class Threading
{
public static void Main()
{
Threading t = new Threading();
t.demo();
}
private int num = 0;
public void doThreading()
{
Thread t1 = new Thread(modify);
Thread t2 = new Thread(modify);
t1.Start();
t2.Start();
Stopwatch timer = new Stopwatch();
timer.Start();
while (thread1.IsAlive || thread2.IsAlive)
{
}
timer.Stop();
Console.WriteLine("Took: " + timer.ElapsedMilliseconds + " milliseconds");
Console.Read();
}
public void modify()
{
for (int i = 0; i < 1000000000; i++)
{
count++;
count--;
}
}
}
运行程序后,由于竞争条件,num不会为0。当我向modify方法添加锁,以便在运行程序后num为0:
public void modify()
{
for (int i = 0; i < 1000000000; i++)
{
lock (this) { count++; }
lock (this) { count--; }
}
}
然后程序执行的时间是8倍。我无法弄清楚为什么它会花费这么长时间,我希望,最多只需要4倍的执行时间。知道为什么要花这么长时间吗?
答案 0 :(得分:0)
lock
似乎非常昂贵(您只需锁定递增int
,即make count++
原子);改为使用Interlocked:
public void modify()
{
for (int i = 0; i < 1000000000; i++)
{
Interlocked.Increment(ref count);
Interlocked.Decrement(ref count);
}
}