Discuz教程网

C#之多线程(中)戏说“死锁”

[复制链接]
authicon smile 发表于 2010-11-24 12:54:34 | 显示全部楼层 |阅读模式
通过多线程可以让效率提升,若大一个仓库装有许多粮食,工人负责把粮食一袋一袋的运到货车上以便卖给分销商。当一个工人的时候,不会发生什么潜在问题,也就是所谓的“单线程”。但是为了提高工作效率,又招了一个(升级为多线程),现在由工人甲、工人乙进行从仓库往货车上背粮食,一直相安无事,结果有一天两人发生了一点小矛盾,导至两人干活总是较着劲,工人甲一开始比工人乙快一些,但是在卸完肩上的粮食之后,忽感腰间一疼,再感又没有事情了,这一缓之际工人乙也把粮食卸到了货车上,于是现在两人速度一样,当两人来到仓库时,莫名的两人竟然同时抓到了同一个粮袋,要放在以前两人肯定会谦让,但是由于现在二人有些矛盾,所以互不相让,这可以看成是线程中的“竟态条件”。老板为了不让二人同时抓取同一个粮袋,在仓库门口修建了一个三米长的狭窄通道,通道只容单人次通过,于是二人由原来的分散状态形成了现在一前一后的效果,倒是再也没有出现同时抓到同一袋粮食的状况(线程同步),可好景不长,由于三米的通道每次只容纳一人直行,无法两人并行,结果这次工人乙比工人甲快出许多,在工人甲刚刚从仓库里背出一袋粮食进入通道时,工人乙也从外出卸完粮食回来了,两人谁也不相让,就这样一直耗着。这就是所谓的线程“死锁”。罗里八嗦的说了这么一堆,其实主要是把线程的一些特性用白话总结了一下,下面用代码将线程死锁表现出来:
using System;
using System.Threading;
namespace zuo_Company.MyDidLockProject{
public class TestThread{
  static void Main(string[] args){
   Shareds sa = new Shareds(333);
   Shareds sb = new Shareds(666);
   
   //SharedThread sd = new SharedThread(sa,sb);
   //new Thread(sd.ThreadRunA).Start();
   //new Thread(sd.ThreadRunB).Start();
   
   new Thread(new SharedThread(sa,sb).ThreadRunA).Start();
   new Thread(new SharedThread(sa,sb).ThreadRunB).Start();
   
   Console.WriteLine("Main method over!");
  }
}

public class Shareds{
  private int Id;
  
  public Shareds():this(1){}
  public Shareds(int x){
   this.Id = x;
  }
  public override string ToString(){
   return "Id:"+this.Id;
  }
}

public class SharedThread{
  private Shareds s1;
  private Shareds s2;
  
  public SharedThread(Shareds s1,Shareds s2){
   this.s1 = s1;
   this.s2 = s2;
  }
  
  public void ThreadRunA(){
   int count = 0;
   while(true){
    lock(s1){
     lock(s2){
      Console.WriteLine("--------------\r\nThreadRunA:");
      Console.WriteLine(s1.ToString());
      Console.WriteLine(s2.ToString());
      Console.WriteLine("Counts:{0}\r\n",count++);
     }
    }
   }
  }
  
  public void ThreadRunB(){
   int count = 0;
   while(true){
    lock(s2){
     lock(s1){
      Console.WriteLine("--------------\r\nThreadRunB:");
      Console.WriteLine(s1.ToString());
      Console.WriteLine(s2.ToString());
      Console.WriteLine("Counts:{0}\r\n",count++);
     }
    }
   }
  }
}
}



上一篇:用C#满足了一个现实的需求
下一篇:C#之委托的异步调用构建轻型线程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-3 05:30

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表