c# mutex互斥量的深入解析
互斥鎖(Mutex)
互斥鎖是一個(gè)互斥的同步對(duì)象,意味著同一時(shí)間有且僅有一個(gè)線程可以獲取它。
互斥鎖可適用于一個(gè)共享資源每次只能被一個(gè)線程訪問的情況
函數(shù):
//創(chuàng)建一個(gè)處于未獲取狀態(tài)的互斥鎖
Public Mutex();
//如果owned為true,互斥鎖的初始狀態(tài)就是被主線程所獲取,否則處于未獲取狀態(tài)
Public Mutex(bool owned);
如果要獲取一個(gè)互斥鎖。應(yīng)調(diào)用互斥鎖上的WaitOne()方法,該方法繼承于Thread.WaitHandle類
它處于等到狀態(tài)直至所調(diào)用互斥鎖可以被獲取,因此該方法將組織住主調(diào)線程直到指定的互斥鎖可用,如果不需要擁有互斥鎖,用ReleaseMutex方法釋放,從而使互斥鎖可以被另外一個(gè)線程所獲取
//Public Mutex(bool owned,name,out flag);
name為互斥量的名字,也就是說在操作系統(tǒng)中只有一個(gè)命名為name的互斥量mutex,如果一個(gè)線程得到這個(gè)name的互斥鎖,其他線程就無法得到這個(gè)互斥鎖了,必須等待那個(gè)線程對(duì)這個(gè)線程釋放
參考別人的博客的代碼實(shí)驗(yàn)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace myConApp
{
class Test
{
/// <summary>
/// 應(yīng)用程序的主入口點(diǎn)。
/// </summary>
[STAThread]
static void Main(string[] args)
{
bool flag = false;
System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", out flag);
//第一個(gè)參數(shù):true--給調(diào)用線程賦予互斥體的初始所屬權(quán)
//第一個(gè)參數(shù):互斥體的名稱
//第三個(gè)參數(shù):返回值,如果調(diào)用線程已被授予互斥體的初始所屬權(quán),則返回true
if (flag)
{
Console.Write("Running");
}
else
{
Console.Write("Another is Running");
System.Threading.Thread.Sleep(5000);//線程掛起5秒鐘
Environment.Exit(1);//退出程序
}
Console.ReadLine();
}
}
}
運(yùn)行以上代碼生成的應(yīng)用程序第一個(gè)實(shí)例,會(huì)得到結(jié)果
Running
保持第一個(gè)運(yùn)行狀態(tài),運(yùn)行第二個(gè)實(shí)例,得到結(jié)果
Another is Running
以上代碼中創(chuàng)建了一個(gè)mutex,從其參數(shù)的解釋中得知,第一個(gè)調(diào)用線程將得到互斥體的初始所屬權(quán),如果不釋放的話,其他的線程得不到互斥體所有權(quán)
1.運(yùn)行兩個(gè)工程,同時(shí)將以上代碼放入工程中,第一個(gè)工程運(yùn)行,得到結(jié)果
Running
保持第一個(gè)運(yùn)行狀態(tài),運(yùn)行第二個(gè)工程,得到結(jié)果
Another is Running
2.將一個(gè)工程中的System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", out flag);改為
System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test1", out flag);
然后第一個(gè)工程運(yùn)行,得到結(jié)果
Running
保持第一個(gè)運(yùn)行狀態(tài),運(yùn)行第二個(gè)工程,得到結(jié)果
Running
則說明在系統(tǒng)中,mutex的name是在系統(tǒng)中是唯一的。
相關(guān)文章
C#實(shí)現(xiàn)大數(shù)字運(yùn)算的實(shí)例代碼
這篇文章介紹了C#實(shí)現(xiàn)大數(shù)字運(yùn)算的實(shí)例代碼,有需要的朋友可以參考一下2013-10-10
C#?線程切換后上下文都去了哪里(.NET高級(jí)調(diào)試分析)
總會(huì)有一些朋友問一個(gè)問題,在 Windows 中線程做了上下文切換,請(qǐng)問被切的線程他的寄存器上下文都去了哪里?這個(gè)問題其實(shí)比較底層,如果對(duì)操作系統(tǒng)沒有個(gè)體系層面的理解以及做過源碼分析,其實(shí)很難說明白,這篇我們就從.NET高級(jí)調(diào)試的角度分析,需要的朋友可以參考下2023-12-12
C# 實(shí)現(xiàn)Table的Merge,Copy和Clone
這篇文章主要介紹了C# 實(shí)現(xiàn)Table的Merge,Copy和Clone,幫助大家更好的利用c#處理文件,感興趣的朋友可以了解下2020-12-12
C#生成帶二維碼的專屬微信公眾號(hào)推廣海報(bào)實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于利用C#如何生成帶二維碼的專屬微信公眾號(hào)推廣海報(bào)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起來看看吧2018-12-12
C#之關(guān)于Base64簡(jiǎn)單加密與解密方式
這篇文章主要介紹了C#之關(guān)于Base64簡(jiǎn)單加密與解密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
C#使用DevExpress中的SplashScreenManager控件實(shí)現(xiàn)啟動(dòng)閃屏和等待信息窗口
這篇文章介紹了C#使用DevExpress中的SplashScreenManager控件實(shí)現(xiàn)啟動(dòng)閃屏和等待信息窗口的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

