主题:求救!!!lock和Monitor的区别
			 zhileyang
				 [专家分:270]  发布于 2006-12-23 11:04:00
 zhileyang
				 [专家分:270]  发布于 2006-12-23 11:04:00							
			请大家帮帮我的忙,在下先谢谢大家了!
      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个回复)
		
								
				沙发
				
					 jzyray [专家分:20610]  发布于 2006-12-22 10:39:00
jzyray [专家分:20610]  发布于 2006-12-22 10:39:00				
				lock相当于C#对Monitor的封装,等价
							 
						
				板凳
				
					 zhpicool [专家分:10]  发布于 2006-12-22 23:18:00
zhpicool [专家分:10]  发布于 2006-12-22 23:18:00				
				Mutex是一个特殊的同步类,它可以跨线程.
如最常见的一个应用:
 Mutex TempMute=new Mutex(true,"ApplicationName",out isOwuned);
在创建互斥无之后,检杳isOwned是否为真,如果为真说明这个应用程序没有其它实例.
							 
						
				3 楼
				
					 zhileyang [专家分:270]  发布于 2006-12-23 11:04:00
zhileyang [专家分:270]  发布于 2006-12-23 11:04:00				
				请大家再帮帮忙,说得清一点行不行,我还是不太了解,求求大家了,还有一个问题,就是monitor类和Mutex类的区别,谢谢大家!!!
							 
						
				4 楼
				
					 liwencocolee [专家分:670]  发布于 2006-12-25 12:30:00
liwencocolee [专家分:670]  发布于 2006-12-25 12:30:00				
				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 楼
				
					 zhileyang [专家分:270]  发布于 2006-12-26 11:00:00
zhileyang [专家分:270]  发布于 2006-12-26 11:00:00				
				谢谢大家,谢谢大家帮我解答,我现在算是有点味了,谢谢,尤其感谢liwencocolee
							 
									
			
我来回复