首先lock和Minitor有什么区别呢?
其实lock在IL代码中会被翻译成Monitor。也就是Monitor.Enter(obj)和Monitor.Exit(obj).
lock(obj)
{
}
等价为:
try
{   
      Monitor.Enter(obj)

}
catch()
{}
finally
{
      Monitor.Exit(obj)

}
所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。那么Monitor额外的功能呢?
1:Monitor.TryEnter(obj,timespan)----timeout之后,就不执行这段代码了。lock可是一直会死等的。

2:还有Monitor.Wait()和Monitor.Pulse()。在lock代码里面如果调用了Monitor.Wait(),会放弃对资源的所有权,让别的线程lock进来。然后别的线程代码里Pulse一下(让原线程进入到等待队列),然后在Wait一下释放资源,这样原线程的就可以继续执行了(代码还堵塞在wait那句话呢)。
也就是说,必须两个或多个线程共同调用Wait和Pulse,把资源的所有权抛来抛去,才不会死锁。

和AutoEvent相似是处理同步关系的,但是AutoEvent是跨进程的,而Monitor是针对线程的。
以下是MSDN的代码示例,调试起来很容易看出来两个函数的作用了,因为尽管是多线程程序,但是是同步操作,所以代码始终是单步执行的。

using System;
using System.Threading;
using System.Collections;

namespace MonitorCS1
{
    class
MonitorSample
    {
       
const int MAX_LOOP_TIME = 100;
       
Queue m_smplQueue;

public MonitorSample()
       
{
           
m_smplQueue = new Queue();
       
}
       
public void FirstThread()
       
{
           
int counter = 0;
           
lock (m_smplQueue)
           
{
               
while (counter < MAX_LOOP_TIME)
               
{
                   
//Wait, if the queue is busy.
                   
Monitor.Wait(m_smplQueue);
                   
//Push one element.
                   
m_smplQueue.Enqueue(counter);
                   
//Release the waiting thread.
                   
Monitor.Pulse(m_smplQueue);

counter++;
               
}
               
int i = 0;
           
}
       
}
       
public void SecondThread()
       
{
           
lock (m_smplQueue)
           
{
               
//Release the waiting thread.
               
Monitor.Pulse(m_smplQueue);
               
//Wait in the loop, while the queue is busy.
               
//Exit on the time-out when the first thread stops.
               
while (Monitor.Wait(m_smplQueue, 50000))
               
{
                   
//Pop the first element.
                   
int counter = (int)m_smplQueue.Dequeue();
                   
//Print the first element.
                   
Console.WriteLine(counter.ToString());
                   
//Release the waiting thread.
                   
Monitor.Pulse(m_smplQueue);
               
}
           
}
       
}
       
//Return the number of queue elements.
       
public int GetQueueCount()
       
{
           
return m_smplQueue.Count;
       
}

static void Main(string[] args)
       
{
           
//Create the MonitorSample object.
           
MonitorSample test = new MonitorSample();
           
//Create the first thread.
           
Thread tFirst = new Thread(new
ThreadStart(test.FirstThread));
           
//Create the second thread.
           
Thread tSecond = new Thread(new
ThreadStart(test.SecondThread));
           
//Start threads.
           
tFirst.Start();
           
tSecond.Start();
           
//wait to the end of the two threads
           
tFirst.Join();
           
tSecond.Join();
           
//Print the number of queue elements.
           
Console.WriteLine("Queue Count = " +
test.GetQueueCount().ToString());
       
}
    }
}

c#中Monitor的使用的更多相关文章

  1. C#中Monitor对象与Lock关键字的区别分析

    这篇文章主要介绍了C#中Monitor对象与Lock关键字的区别,需要的朋友可以参考下 Monitor对象 1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(ob ...

  2. C#知识点总结系列:4、C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  3. C#中Monitor类、Lock关键字和Mutex类

    线程:线程是进程的独立执行单元,每一个进程都有一个主线程,除了主线程可以包含其他的线程.多线程的意义:多线程有助于改善程序的总体响应性,提高CPU的效率.多线程的应用程序域是相当不稳定的,因为多个线程 ...

  4. C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  5. 锁、C#中Monitor和Lock以及区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  6. 转:C#中Monitor对象与Lock关键字的区别分析

    Monitor对象1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  7. 关于android sdk中monitor.exe报错的问题

    今天又是被坑的一上午.来总结一下: 1. 首先是找不到monitor的问题: 这个可能是一开始环境配置错误.所以我将android sdk重装了一下就好了 2. 第二个是找到monitor.bat发现 ...

  8. 【C#】【Thread】Monitor和Lock

    所谓锁,就是之锁定的区域只能单个线程进入进行操作,其他线程在锁的外围等待.Monitor锁通过Monitor.Enter(obj)和Monitor.Exit(obj)来锁定和解锁.Lock锁则直接Lo ...

  9. linux中set的用法

    功能说明:设置shell.语 法:set [+-abCdefhHklmnpPtuvx]补充说明:用set 命令可以设置各种shell选项或者列 出shell变量.单个选项设置常用的特性.在某些选项之后 ...

随机推荐

  1. 如何在Windows下开发Python:在cmd下运行Python脚本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE

    http://www.crifan.com/how_to_do_python_development_under_windows_environment/ 本文目的 希望对于,如何在Windows下, ...

  2. 【BZOJ4476&JSOI2015】送礼物(二分,RMQ)

    ANS明显是有二分性的 二分答案,设二分值为b M(i,j)−m(i,j)j−i+k>b 显然当l<长度<r时,一端是最小值,一端是最大值. 等于l或r的时候因为可能不满足以上性质, ...

  3. 不用框架使用ajax 纯js使用ajax post,get范例及其区别

    原文发布时间为:2009-11-15 -- 来源于本人的百度文章 [由搬家工具导入] 不用框架使用ajax 纯js使用ajax post,get范例及其区别 ===================== ...

  4. 关于eclipse总是出现adb refused request的问题(转)

    1.检查下是不是开启了手机助手之类2.打开进程管理器,结束所有的adb.exe 3.关闭所有的杀毒软件之类的东东4.检查USB连接线,USB口,把USB线连在电脑主机后面的USB口5.重启eclips ...

  5. DCP port

    DCP port: D+ D- short. This doesn't support any data transfer. Without the need ofr enumeration. Can ...

  6. java中 文件压缩处理

    public static void main(String[] args) throws IOException { File file=new File("./mhxx_configs. ...

  7. 通过使用集合Properties完成JDBC的连接工具类

    1.将数据库连接对象所需参数保存在本地文件中 database.properties driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localh ...

  8. [CF665F]Four Divisors

    题目大意: 给定$n(n\leq10^{11})$,求$\displaystyle\sum_{i=1}^n[\tau(i)=4]$. 思路: 设$p,q$为不相等的质数,则满足$\tau(i)=4$的 ...

  9. 误删docker0网桥之后怎么办呢?

    今天,在搭建k8s node节点环境的时候,好巧不巧,执行了如下命令: [root@hxin221 ~]# ifconfig docker0 down &>/dev/null [root ...

  10. xamarin.android 消息推送功能--极光推送

    最近在使用xamarin.android的消息推送功能,官方使用的例子是FCM方式,按照官方文档,使用FQ软件是可以成功的,但是在国内由于众所周知的原因,在国内服务并不能使用,于是查找国内各自推送平台 ...