线程同步对象的使用方法

2008-08-15 10:21:11.0     浏览:1009     来源:中国IT实验室
关键词:  线程同步     使用方法  

使用Monitor类的方法大致一样:

  Monitor的常用方法:Enter和Exit都是静态方法,作用跟lock语句的两个花括号一样。 而使用 Mutex 就不需声明一个“令牌”对象了,但要实例化之后才可以使用:

  public class Tools

  {

  private Mutex mut = new Mutex();

  private int count = 100;

  public void Add(int n)

  {

  mut.WaitOne();

  count+=n;

  mut.ReleaseMutex();

  }

  public void Delete(int n)

  {

  mut.WaitOne();

  count-=n;

  mut.ReleaseMutex();

  }

  }

  其中的WaitOne为等待方法,一直等到Mutex 被释放为止。初始的情况下,Mutex 对象是处于释放状态的,而一旦执行了WaitOne方法之后,它 就被捕获了,一直到被调用了ReleaseMutex方法之后才被释放。

  使用这三种方法都有一个要注意的问题,就是在独占代码段里面如果引起了异常,可能会使“令牌”对象不被释放,这样程序就会一直地死等下去了。

  所以要在独占代码段里面处理好异常。例如下面这样的代码就是错误的:

  public void Add(int n)

  {

  try

  {

  mut.WaitOne();

  count+=n;

  //....这里省略了N行代码

  //....这里是有可能引起异常的代码

  //....这里省略了N行代码

  mut.ReleaseMutex();

  }

  catch

  {

  Console.Writeline("error.");

  }

  }

  上面的代码一旦在try和catch里面发生了异常,那么Mutex就不能被释放,后面的程序就会卡死在WaitOne()一行,而应该改成这样:

  public void Add(int n)

  {

  mut.WaitOne();

  try

  {

  count+=n;

  //....这里省略了N行代码

  //....这里是有可能引起异常的代码

  //....这里省略了N行代码

  }

  catch

  {

  Console.Writeline("error.");

  }

  mut.ReleaseMutex();

  }

  现在谈一下第二种:

  ManualResetEvent类,AutoResetEvent类

  上面这两个类都是由EventWaitHandle类派生出来的,所以功能和调用方法都很相似。这两个类常用于阻断某个线程的执行,然后在符合条件的情况下再恢复其执行。

  举个例子,你想送花给一个MM,托了一个送花的小伙子送了过去,而你希望当MM收到花之后就立即打个电话过去告诉她。

[上一页]   [第1页]   [第2页]   [第3页]   [第4页]   [第5页]   [下一页]