詳解.NET 同步與非同步 之 Mutex
本隨筆續接:.NET 同步與非同步之線程安全的集合(十一)
本隨筆及接下來的兩篇隨筆,將介紹.NET 同步與非同步系列的最後一個大塊知識點:WaitHandle家族。
抽象基底類別:WaitHandle, 三個子類別: EventWaitHandle(Event通知) 、Mutex(進程同步鎖定)、Semaphone (信號量),還有兩個孫子輩:System.Threading.AutoResetEvent、System. Threading.ManualResetEvent,都是 EventWaitHandle 的子類別。
一、抽象基底類別 WaitHandle
[ComVisibleAttribute(true)]public abstract class WaitHandle : MarshalByRefObject, IDisposable
透過上面的訊息,我們可以知道 WaitHandle 繼承自 MarshalByRefObject, 並實作了 IDisposable 介面。
對於 MarshalByRefObject ,你也許不是很熟悉,但它的很多子類你一定會用過的,讓我們來揭開它的廬山真面目。
在MSND中是這樣描述 MarshalByRefObject 的:
應用程式域是一個作業系統進程中一個或多個應用程式所駐留的分割區。同一應用程式域中的物件直接通訊。不同應用程式域中的物件的通訊方式有兩種:一種是跨應用程式域邊界傳輸物件副本,一種是使用代理交換訊息。 MarshalByRefObject 是透過使用代理交換訊息來跨應用程式域邊界進行通訊的物件的基底類別。
看到這裡你也許更困惑了,我用過它? 用過它的子類別? 沒錯,就是用過它的子類,而且還很多。
例如System.Drawing命名空間的Brush、Image、Pen、Font 等等,還有個大家更熟悉的System.IO命名空間下的Stream.
延展閱讀:利用 MarshalByRefObject 實作AOP 。
看到這裡我們只要知道 WaitHandle 具有跨應用程式網域進行通訊的能力就可以了。
二、Mutex(進程同步鎖定)
1、MSDN對Mutex的定義為進程間的同步基元, 即鎖定的概念。
反觀Monitor、平常只用來在應用程式域內的執行緒之間通訊。其實,如果用於鎖的物件衍生自MarshalByRefObject,Monitor 也可在多個應用程式網域中提供鎖定。
Mutex由於需要呼叫作業系統資源,因此執行的開銷比Monitor大得多,所以如果僅需要在應用程式內部的執行緒間同步操作,Monitor/lock應是首選
# 2、Mutex 的用法
WaitOne() /WaitOne(TimeSpan, Boolean)及若干個重載:請求所有權,該調用會一直阻塞到當前mutex 收到信號,或直至達到可選的超時間隔,這幾個方法都不需要提供鎖定物件作為額外參數。
您可以使用 WaitHandle.WaitOne 請求所有權的互斥體的方法。 呼叫執行緒被阻止,直到發生下列情況之一︰
#互斥體發出訊號以指示不擁有。 在此情況下, WaitOne 方法將傳回 true, ,呼叫執行緒的互斥體所有權,並存取由 mutex 保護的資源。 執行緒完成後存取資源,必須呼叫 ReleaseMutex 方法來釋放 mutex 的所有權。
#對呼叫中指定的逾時間隔 WaitOne 具有方法 millisecondsTimeout 或 timeout 參數已過。 在此情況下, WaitOne 方法將傳回 false, 此時該執行緒不會取得互斥體的所有權。
ReleaseMutex():釋放目前 Mutex 一次。請注意,這裡強調了一次,因為擁有互斥體的線程可以在重複的調用WaitOne系列函數而不會阻止其執行;這個跟Monitor的Enter()/Exit()可以在獲取物件鎖定後可以被重複調用一樣。 Mutex被呼叫的次數由公共語言運行庫(CLR)保存,每WaitOne()一次計數+1,每ReleaseMutex()一次計數-1,只要這個計數不為0,其它Mutex的等待者就會認為這個Mutex沒有被釋放,也就沒有辦法獲得該Mutex。 另外,跟Monitor.Exit()一樣,只有Mutex的擁有者才能RleaseMutex(),否則會引發異常。
如果執行緒在擁有互斥體時終止,我們稱此互斥體被遺棄(Abandoned)。在MSDN裡,微軟以警告的方式指出這屬於「嚴重的」程式錯誤。這是說擁有mutex的擁有者在獲得所有權後,WaitOne()和RelaseMutex()的次數不對等,呼叫者本身又不負責任地中止,造成mutex 正在保護的資源可能會處於不一致的狀態。其實,這只不過是提醒你記得在try/finally結構中使用Mutex。
3、全局和局部的Mutex
如果在一个应用程序域内使用Mutex,当然不如直接使用Monitor/lock更为合适,因为前面已经提到Mutex需要更大的开销而执行较慢。不过Mutex毕竟不是Monitor/lock,它生来应用的场景就应该是用于进程间同步的。用于在进程间通讯的Mutex我们称为全局Mutex,而只用于在应用程序域内部通讯的Mutex、我们称为局部Mutex.
全局Mutex和局部Mutex是通过构造函数来构造不同的实例的,让我们来看一下Mutex的构造函数,一共有5个,挑两个具有代表性的看一下吧:
Mutex():用无参数的构造函数得到的Mutex没有任何名称,而进程间无法通过变量的形式共享数据,所以没有名称的Mutex也叫做局部(Local)Mutex。另外,这样创建出的Mutex,创建者对这个实例并没有拥有权,仍然需要调用WaitOne()去请求所有权。
Mutex(Boolean initiallyOwned, String name, out Booldan createdNew, MutexSecurity):第一个bool参数:指示初始化的实例是否拥有互斥体所有权。第二个string类型、为互斥体指定一个名称,如果string为null或者空字符串 则相当于创建一个没有名字的Mutex,当属于局部Mutex. 而有名字的Mutex当属于全局Mutex.第三个bool参数、如果已经初始化了互斥体 返回True, 如果互斥体已经存在则返回False. 最后一个参数用于Mutex访问的安全性控制。
4、用途
Mutex天生为进程间的同步基元,因此它可以用来控制应用程序的单实例:
/// <summary>/// 单实例运行/// </summary>/// <returns> true 应用程序已启动,false 则没有 </returns>public bool SingleRun(ref System.Threading.Mutex mutex ) { mutex = new System.Threading.Mutex(false, "WINDOWS"); if (!mutex.WaitOne(0, false)) { mutex.Close(); mutex = null; } if (mutex == null) { return true; } return false; }
以上是詳解.NET 同步與非同步 之 Mutex的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

一般來說,我們只需要同時使用耳機或音響的其中一個設備,但是有些朋友反映在win11系統中,遇到了耳機和音響一起響的問題,其實我們可以在realtek面板中將它關閉,就可以了,下面一起來看一下吧。 win11耳機和音響一起響怎麼辦1、先在桌面上找到並打開“控制面板”2、進入控制面板,在其中找到並打開“硬體和聲音”3、然後再找到一個喇叭圖標的“Realtek高清晰音訊管理器”4、選擇“揚聲器”再點擊“後面板”進入揚聲器設定。 5.打開之後我們可以看到設備類型,如果要關閉耳機就取消勾選“耳機”,如果要

當您在您的同步資料夾中發現一個或多個項目與Outlook中的錯誤訊息不符時,這可能是因為您更新或取消了會議項目。在這種情況下,您會看到一條錯誤訊息,提示您的本機資料版本與遠端副本有衝突。這種情況通常發生在Outlook桌面應用程式中。您同步的資料夾中的一個或多個項目不符。若要解決衝突,請開啟這些項目,然後重試此操作。修復同步的資料夾中的一個或多個項目不符合Outlook錯誤在Outlook桌面版中,當本機行事曆項目與伺服器副本發生衝突時,可能會遇到問題。不過,幸運的是,有一些簡單的方法可以幫助您

當今人工智慧(AI)技術的發展如火如荼,它們在各個領域都展現了巨大的潛力和影響力。今天大姚給大家分享4個.NET開源的AI模型LLM相關的專案框架,希望能為大家提供一些參考。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一種開源的軟體開發工具包(SDK),旨在將大型語言模型(LLM)如OpenAI、Azure

win10剪貼簿有個非常好用的功能就是跨裝置雲端儲存功能,非常的好用可以幫助用戶PC設備和手機設備同步複製貼上。設定的方法非常簡單,只要在系統裡的剪切板設置就好。 win10剪貼簿同步到手機1、先點選左下角的開始,進入設定。 2、然後去點選「系統」。 3.選擇左側的「剪貼簿」。 4.最後在右邊的「跨裝置同步」點選登錄,然後選擇手機就好了。

並發和非同步編程並發編程處理同時執行的多個任務,非同步編程是一種並發編程,其中任務不會阻塞線程。 asyncio是python中用於非同步程式設計的函式庫,它允許程式在不阻塞主執行緒的情況下執行I/O操作。事件循環asyncio的核心是事件循環,它監控I/O事件並調度相應的任務。當一個協程準備好時,事件循環會執行它,直到它等待I/O操作。然後,它會暫停協程並繼續執行其他協程。協程協程是可暫停和恢復執行的函數。 asyncdef關鍵字用於建立協程。協程使用await關鍵字等待I/O作業完成。 asyncio的基礎以下

百度雲同步盤怎麼同步?百度雲同步盤中可以選擇文件來同步,但是多數的用戶不知道如何同步百度雲文件,接下來就是小編為用戶帶來的百度云同步盤同步方法圖文教程,有興趣的用戶快來一起看看吧!百度雲同步盤怎麼同步1、先進入電腦桌面,右鍵點選【百度雲同步盤】圖標,選擇【設定】;2、之後展開服務小窗口,切換到【進階設定】頁面點選【選擇資料夾】; 3.最後切換到下圖的頁面,勾選需要同步的檔案點選【確定】即可。

並發程式設計中的鎖定與同步在並發程式設計中,多個行程或執行緒同時執行,這可能會導致資源爭用和不一致性問題。為了解決這些問題,需要使用鎖定和同步機制來協調對共享資源的存取。鎖的概念鎖是一種機制,它允許一次只有一個執行緒或程序存取共享資源。當一個執行緒或程序獲得鎖時,其他執行緒或程序將被阻止存取該資源,直到鎖被釋放。鎖的類型python中有幾種類型的鎖:互斥鎖(Mutex):確保一次只有一個執行緒或程序可以存取資源。條件變數:允許執行緒或行程等待某個條件,然後取得鎖定。讀寫鎖:允許多個執行緒同時讀取資源,但只允許一個執行緒寫入資
