本文共 3208 字,大约阅读时间需要 10 分钟。
本文主要用来说明多线程中异常情况的处理。
问题出现:使用Lock进行多线程中的同步的时候,如果在Lock块里面出现了异常,那么同步的资源(变量)就没有办法被释放,最终将导致线程死锁。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 7 namespace testLockList 8 { 9 class Program10 {11 12 const int ThreadMaxNum = 5;//线程的最大数目13 static void Main(string[] args)14 {15 TestList myList = new TestList();16 for (int i = 0; i < ThreadMaxNum; i++)//同时建立5个进程,调用Add方法,看锁住了List,是否能对List里面的单个元素进行修改17 {18 Thread myth = new Thread(TestList.add);19 myth.Name = string.Format("线程{0}", i);20 myth.IsBackground = true;21 myth.Start();22 }23 while (TestList.AddInvokeCount != 5)24 {25 Thread.Sleep(500);26 }27 28 }29 }30 31 public class TestList32 {33 static ListmyList = new List ();//一个List34 static Mutex myMutex = new Mutex(); //信号量35 public static int AddInvokeCount = 0; //用于记录Add被调用的次数36 public TestList()37 {38 myList.Add(new tester(0, 0));39 }40 static public void add()41 {42 43 lock (myList)44 {45 46 47 myMutex.WaitOne(); //信号量P操作48 int Num = myList.Count + 1;49 Thread.Sleep(1000);//保证线程等待50 51 myList.Add(new tester(Num, Num));52 Console.WriteLine(Num);53 Console.WriteLine("线程{0}:增加", Thread.CurrentThread.Name);54 if (AddInvokeCount == 3) //这里故意引发一个Exception55 {56 int b = 0;57 int a = 1 / b;58 }59 AddInvokeCount++;60 }61 62 }63 }64 /// 65 /// 这个类只是用于测试66 /// 67 public class tester68 {69 int a;70 int b;71 public tester(int a, int b)72 {73 this.a = a;74 this.b = b;75 }76 77 }78 }
出现的问题截图,如图1所示。
图1 Lock块内出现异常导致进程死锁
解决方法:使用信号量加try_catch_finally处理异常情况
注:以下代码跟上面的问题代码不同的只是add()函数
1 static public void add() 2 { 3 4 try 5 { 6 myMutex.WaitOne(); //信号量P操作 7 int Num = myList.Count + 1; 8 Thread.Sleep(1000);//保证线程等待 9 10 myList.Add(new tester(Num, Num));11 Console.WriteLine(Num);12 Console.WriteLine("线程{0}:增加", Thread.CurrentThread.Name);13 if (AddInvokeCount == 3) //这里故意引发一个Exception14 {15 int b = 0;16 int a = 1 / b; 17 }18 AddInvokeCount++;19 20 }21 catch (System.Exception ex)22 {23 24 }25 finally26 {27 myMutex.ReleaseMutex(); //信号量V操作28 }29 }
运行效果,见图2:
图2 修复后效果
2013-01-02 00:33:53
本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/archive/2013/01/02/2841847.html如需转载请自行联系原作者
kissazi2