C#,多线程死锁很容易哦


原文写于:2008-02-04

    这几天在看C#多线程的东东,确保多个线程不死锁是比较难的,但要死锁很容易。试着写了段死锁的代码,见下文。
 环境:.NET 2.0
 基本思路:学OS时的经典问题,两个线程抢占两个资源,线程1抢到了资源A,还需要资源B;线程2抢到了资源B,还需要资源A;结果就死锁了。 
1usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.Text;
4usingSystem.Threading;
5
6namespaceMultiThreadTest
7{
8classProgram
9{
10staticvoidMain(string[]args)
11{
12Deadlock
20}

21
23}

24
25classDeadlock
26{
27objectlocker1=newobject();
28objectlocker2=newobject();
29strings1="StartFromLocker1",s2="StartFromLocker2";
30stringl1="locker1",l2="locker2";
31
32publicvoidStartFromLocker1()
33{
34lock(locker1)
35{
36Console.WriteLine("{0}got{1}",s1,l1);
37Thread.Sleep(500);
38Console.WriteLine("{0}waitingfor{1}",s1,l2);
39lock(locker2)
40{
41Console.WriteLine("{0}got{1}",s1,l2);
42Thread.Sleep(500);
43}

44}

45Console.WriteLine("leaving{0}",s1);
46}

47
48publicvoidStartFromLocker2()
49{
50lock(locker2)
51{
52Console.WriteLine("{0}got{1}",s2,l2);
53Thread.Sleep(500);
54Console.WriteLine("{0}waitingfor{1}",s2,l1);
55lock(locker1)
56{
57Console.WriteLine("{0}got{1}",s2,l1);
58Thread.Sleep(500);
59}

60}

61Console.WriteLine("leaving{0}",s2);
62}

63}
;
64}
 运行结果:
StartFromLocker1 got locker1
StartFromLocker2 got locker2
StartFromLocker1 waiting for locker2
StartFromLocker2 waiting for locker1



			

                        优质内容筛选与推荐>>
1、学习笔记,持续更新
2、论文笔记《ImageNet Classification with Deep Convolutional Neural Network》
3、【计算机组成原理】 总线
4、A Guide to setup SQL Server Reporting Services (SSRS) with Dynamics AX
5、GridView 與 DetailsView 連動 - 繫結同一個 SqlDataSource


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号