回 帖 发 新 帖 刷新版面

主题:求救!!!lock和Monitor的区别

请大家帮帮我的忙,在下先谢谢大家了!
      1.lock和Monitor有什么区别?      
      2.Monitor.enter和Monitor.exit是不是相当于同步互斥中进入/退出临界区的P,V操作?
      3.假设b是需要互斥访问的变量,Monitor.enter(this),Monitor.exit(this)和Monitor.enter(b),Monitor.exit(b)有什么区别? lock(this)和lock(b)有什么区别?  


       请大家再帮帮忙,说得清一点行不行,我还是不太了解,求求大家了,还有一个问题,就是monitor类和Mutex类的区别,谢谢大家!!!

回复列表 (共5个回复)

沙发

lock相当于C#对Monitor的封装,等价

板凳

Mutex是一个特殊的同步类,它可以跨线程.
如最常见的一个应用:
 Mutex TempMute=new Mutex(true,"ApplicationName",out isOwuned);
在创建互斥无之后,检杳isOwned是否为真,如果为真说明这个应用程序没有其它实例.

3 楼

请大家再帮帮忙,说得清一点行不行,我还是不太了解,求求大家了,还有一个问题,就是monitor类和Mutex类的区别,谢谢大家!!!

4 楼

System.Monitor类(锁定与信号量)进行线程同步:
using System;
using System.Threading;

public void SaveData(string text) //线程执行函数或线程执行函数调用的对象的方法
{
  ...   //执行其他一些不需要同步的处理

  Monitor.Enter(this); //获取对象的Monitor锁
  ...   //执行需要同步的处理
  Monitor.Exit(this); //释放对象的Monitor锁

  ...   //执行其他一些不需要同步的处理
}
说明:当执行Monitor.Enter方法时。这个方法会试图获取对象上的Monitor锁,如果另一个线程已经拥有了这个锁,这个方法将会阻塞(block),直到这个锁被释放。
也可用C#的lock语句来获得和释放一个Monitor锁。上面同步写成:
public void SaveData(string text) //线程执行函数或线程执行函数调用的对象的方法
{
  ...   //执行其他一些不需要同步的处理

  lock(this)  //获取对象的Monitor锁,代码块执行完成后释放Monitor锁
  {
  ...   //执行需要同步的处理
  }

  ...   //执行其他一些不需要同步的处理
}

也可以使用System.Threading名称空间的Mutex类(互斥类)进行线程同步。与Monitor锁一样,一次只有一个线程
能获得一个给定的互斥。但Mutex要慢得多,但它增加了灵活性。例:
using System;
using System.Threading;
class Database
{
  Mutex mutex = new Mutex(false); //创建一个互斥,但不立即获得它
     //注意:创建互斥在需要同步的方法之外,实际上它只要创建一个实例
  public void SaveData(string text) //需要同步的方法
  {
    mutex.WaitOne();  //等待获得互斥
    ...    //需要同步的处理
    mntex.Close();  //释放互斥
  }
}

Mutex类重载了三个构造函数:
Mutex()       //创建并使创建类立即获得互斥
Mutex(bool initiallyOwned)    //创建时可指定是否要立即获得互斥
Mutex(bool initiallyOwned, string muterName)  //还可以指定互斥的名称
Mutex.WaitOne方法也重载了三次:
Mutex.WaitOne()      //一直等待
Mutex.WaitOne(TimeSpan time, bool exitContext)  //等待TimeSpan指定的时间
Mutex.WaitOne(int milliseconds, bool exitContext) //等待指定的毫秒

5 楼

谢谢大家,谢谢大家帮我解答,我现在算是有点味了,谢谢,尤其感谢liwencocolee

我来回复

您尚未登录,请登录后再回复。点此登录或注册