c#中Monitor的使用

首先lock和Minitor有什麼區別呢?
其實lockIL代碼中會被翻譯成Monitor
也就是Monitor.Enter(obj)Monitor.Exit(obj).
lock(obj)
{
}
等價爲:
 try
{    
     
 Monitor.Enter(obj) 
 }
 catch()
{}
 finally
{
     
	onitor.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那句話呢)。
也就是說,必須兩個或多個線程共同調用WaitPulse,把資源的所有權拋來拋去,纔不會死鎖。
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);

         
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章