主题:求救!!!lock和Monitor的区别
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
lock相当于C#对Monitor的封装,等价
板凳
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
请大家再帮帮忙,说得清一点行不行,我还是不太了解,求求大家了,还有一个问题,就是monitor类和Mutex类的区别,谢谢大家!!!
4 楼
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
谢谢大家,谢谢大家帮我解答,我现在算是有点味了,谢谢,尤其感谢liwencocolee
我来回复