有趣的多线程编程(3)——线程内部是如何进行的?

王朝c#·作者佚名  2006-12-17
宽屏版  字体: |||超大  

有趣的多线程编程(3)——线程内部是如何进行的?

有趣的多线程编程(3)——线程内部是如何进行的? //TestThread.cs

using System;, count); }

//InnerDataThread.cs

, tmp); Thread.Sleep(50); tmp++; Console.WriteLine (, tmp); Thread.Sleep(20); count = tmp; Console.WriteLine (, tmp); Thread.Sleep(30); } thread.Join(); Console.WriteLine (, count); } , tmp); Thread.Sleep(20); tmp++; Console.WriteLine (, tmp); Thread.Sleep(10); count = tmp; Console.WriteLine (, tmp); Thread.Sleep(40); } }}Read count=0 Read count=0 Incremented tmp to 1 Written count=1Incremented tmp to 1Written count=1 Read count=1 Incremented tmp to 2Read count=1 Written count=2 Read count=2Incremented tmp to 2 Incremented tmp to 3Written count=2 Written count=3Read count=3 Read count=3Incremented tmp to 4 Incremented tmp to 4 Written count=4Written count=4 Read count=4Read count=4 Incremented tmp to 5 Written count=5Incremented tmp to 5Written count=5Read count=5Incremented tmp to 6Written count=6Final count: 6

再比较下面这个例子:

//使用Monitor.Enter/Exit

//MonitorThread.cs

{

{

ThreadStart job =

Thread thread =

thread.Start();

{

Monitor.Enter(countLock);

Console.WriteLine (, tmp);

Thread.Sleep(50);

tmp++;

Console.WriteLine (, tmp);

Thread.Sleep(20);

count = tmp;

Console.WriteLine (, tmp);

Monitor.Exit(countLock);

Thread.Sleep(30);

}

thread.Join();

Console.WriteLine (, count);

}

{

{

Monitor.Enter(countLock);

Console.WriteLine (, tmp);

Thread.Sleep(20);

tmp++;

Console.WriteLine (, tmp);

Thread.Sleep(10);

count = tmp;

Console.WriteLine (, tmp);

Monitor.Exit(countLock);

Thread.Sleep(40);

}

}

}

结果与上例InnerDataThread.cs是不一样的,原因就在于Monitor的使用了。

Read count=0Incremented tmp to 1Written count=1 Read count=1 Incremented tmp to 2 Written count=2Read count=2Incremented tmp to 3Written count=3 Read count=3 Incremented tmp to 4 Written count=4Read count=4Incremented tmp to 5Written count=5 Read count=5 Incremented tmp to 6 Written count=6Read count=6Incremented tmp to 7Written count=7 Read count=7 Incremented tmp to 8 Written count=8Read count=8Incremented tmp to 9Written count=9 Read count=9 Incremented tmp to 10 Written count=10Final count: 10

下面使用lock来锁定线程:

// LockThread.cs

{

{

ThreadStart job =

Thread thread =

thread.Start();

{

{

Console.WriteLine (, tmp);

Thread.Sleep(50);

tmp++;

Console.WriteLine (, tmp);

Thread.Sleep(20);

count = tmp;

Console.WriteLine (, tmp);

}

Thread.Sleep(30);

}

thread.Join();

Console.WriteLine (, count);

}

{

{

{

Console.WriteLine (, tmp);

Thread.Sleep(20);

tmp++;

Console.WriteLine (, tmp);

Thread.Sleep(10);

count = tmp;

Console.WriteLine (, tmp);

}

Thread.Sleep(40);

}

}

}

结果如何?与MonitorThread.cs比较一下,再想想看。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有