首頁>Program>source

要掌握某些技術,您必须知道它是如何在较低的抽象級別上製造的.對於多執行緒程式設計,最好了解同步原語。
這是一个問题,如何在.NET中實現Lock(Monitor)?

我被這些方面所吸引:
-它利用OS物件吗?;
-它需要使用者模式還是內核模式?;
-等待鎖定的執行緒的開銷是多少?;
-在什麼情况下執行緒会排队等待鎖?

Updated:
"如果有多个執行緒爭用该鎖,它们將在"就绪佇列"中排队,並以先到先得的方式授予该鎖。註意:windows和CLR行為的细微差別意味着:" [簡而言之,C#4.0,約瑟夫·阿爾巴哈裏(Joseph Albahari)],這就是我在最後一个關於"违規佇列"的問题中所問的問题。

最新回復
  • 5月前
    1 #

    wikipedia文章很好地描述了"监视器"是什麼以及其基础技術"條件變數"。

    請註意,.NET Monitor是條件變數的正確實現; 大多數已發佈的win32 CV實現都是錯誤的,即使是在知名的来源(例如Dobbs博士)中發現的也是如此.這是因為無法从現有的win32同步原語轻松構建CV。

    .NET CV實現不仅利用win32原語構建浅(且不正確)的包裝器,還利用了它在.NET平臺上,實現其自己的等待佇列等事實的優势。

  • 5月前
    2 #

    经過一些調查,我找到了問题的答案.总的来說,CodeInChaos和Henk Holterman是正確的,但是這裏有一些细节.

    当執行緒首先開始与其他執行緒爭用鎖時,它会尝試等待获取一段時間的自旋等待迴圈.所有這些操作均在user-mode中執行.然後,如果没有成功,則OS內核物件 Event 建立後,執行緒將切換到內核模式並等待来自此 Event的訊號 .

    所以我的問题的答案是:
    1.在更好的情况下,不,但在更壞的情况下, 懒惰地建立物件(如果需要);
    2.通常,它在使用者模式下工作,但是如果執行緒爭夺鎖的時間太长,則可以將執行緒切換到內核模式(通過win API非託管函式呼叫);
    3.从使用者模式切換到內核模式的開銷(約1000个CPU週期);
    4. Microsoft声稱它是類似於FIFO的"诚實"演算法,但不能保證這一點. (例如,如果"等待佇列"中的執行緒將被掛起,則執行緒將在恢複時移至佇列末尾。)

    Event

  • c#:NET 40中的OnewayToSource繫結似乎已损壞
  • regex:Javascript-返迴方括號之間的字元串