簡體   English   中英

有人可以給我一個如何在C#中使用System.Monitor的簡單示例嗎?

[英]Please can someone give me a simple example of how to use System.Monitor in C#?

我發現System.Monitor非常令人困惑,雖然我理解線程,鎖,死鎖,競爭條件,餐飲哲學家和所有爵士樂。 通常我使用ManualResetEvent()來進行線程間協調,但我知道這是一個重量級的內核對象,System.Monitor(Enter / Pulse等)效率更高。 我用谷歌搜索和谷歌搜索,但找不到一個明智的例子。

如果SO工作人員可以向我解釋這個可能很棒的構造,我將非常感激:-)

這是一個非常簡單的例子; Wait的調用釋放鎖(允許Worker獲取它)並將Main線程添加到lock-object的掛起隊列中。 然后, Worker獲取鎖定,並調用Pulse :這會將Main線程移動到lock-object的就緒隊列中。 Worker 釋放鎖時, Main可以恢復工作。

請注意, lock(obj) {...}只是try / finally塊中Monitor.Enter / Monitor.Exit編譯器。

[編輯:我之前更改了示例以移動lock(sync) ,以避免錯過Pulse的(不太可能)風險]

    static void Main()
    {
        object sync = new object();
        lock (sync)
        {
            ThreadPool.QueueUserWorkItem(Worker, sync);
            Console.WriteLine("Main sleeping");

            // wait for the worker to tell us it is ready
            Monitor.Wait(sync);
            Console.WriteLine("Main woke up!");
        }
        Console.WriteLine("Press any key...");
        Console.ReadKey();
    }
    static void Worker(object sync)
    {
        Console.WriteLine("Worker started; about to sleep");
        Thread.Sleep(5000);
        Console.WriteLine("Worker about pulse");
        lock (sync)
        { // notify Main that we did something interesting
            Monitor.Pulse(sync);
            Console.WriteLine("Worker pulsed; about to release lock");
        }
        Console.WriteLine("Worker all done");
    }

看看我的線程文章的這一部分是否有幫助......(該頁面的后半部分)。 它實現了一個生產者/消費者隊列:當生產者在隊列中生成某些東西(並發現它是空的 - 作為優化)時,它會激活監視器以喚醒任何等待的線程。 當消費者嘗試從隊列中消耗但發現它為空時,它會在再次嘗試之前等待一個脈沖。

或者, Joe Albahari的線程教程也有一個關於Wait / Pulse的部分。

它與你習慣使用的WaitHandle非常相似 - 雖然坦率地說我發現比WaitHandles更容易讓人頭腦發熱,主要是因為它與Java等待/通知類似,我“長大”了:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM