博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程同步中异常情况的处理
阅读量:6594 次
发布时间:2019-06-24

本文共 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 List
myList = 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

你可能感兴趣的文章
SpringBoot | 第零章:前言
查看>>
ES 学习笔记-安装
查看>>
微信支付-H5支付绕过ip地址
查看>>
SpringCloud微服务实战
查看>>
Vue、Typescript 的项目实践
查看>>
Jenkins搭建
查看>>
JavaScript在浏览器环境下的事件循环(Event Loop)
查看>>
JS 事件
查看>>
如何优雅的设计RESTful API?这是我看过讲的最清晰的文章!
查看>>
前端技术 | react-router,去中心化式路由
查看>>
iOS加密解密算法
查看>>
如何对接PaaS平台外部的Maven仓库以及如何使用平台自带Maven仓库
查看>>
JavaScript 算法
查看>>
Redis +Codis 百万并发同城多机房使用与经验
查看>>
年终回顾,为你汇总一份「后端架构技术清单」
查看>>
20 分钟教你搞懂 Git!
查看>>
为了避免性别偏见 Google翻译将思考如何解决问题
查看>>
区块链软件公司:为什么区块链项目真正落地的那么少
查看>>
在Developerkit开发板上运行blink例程
查看>>
别人的双11 & 程序员的双11~
查看>>