C# Mutex互斥鎖

Mutex 構造函數 (Boolean, String, Boolean)

public Mutex (
    bool initiallyOwned,
    string name,
    out bool createdNew
)

參數

initiallyOwned

若是爲 true,則給予調用線程已命名的系統互斥體的初始所屬權(若是已命名的系統互斥體是經過此調用建立的);不然爲 false函數

name

Mutex 的名稱。若是值爲 空引用(在 Visual Basic 中爲 Nothing),則 Mutex 是未命名的。spa

createdNew
       若是調用線程已被授予互斥體的初始所屬權,則此方法返回時包含布爾值 true;不然包含布爾值 false。該參數未經初始化即被傳遞
1、當Mutex已存在的時候
static void Main(string[] args)
        {
            Thread th1 = new Thread(Thread1);
            Thread th2 = new Thread(Thread2);
            th1.Start();
            th2.Start();
            Console.ReadKey();
        }
        public static void Thread1()
        {
            bool bCreatedNewMutex;
            Mutex m = new Mutex(true, "HAHA", out bCreatedNewMutex);  //若是名爲"HAHA"的互斥鎖不存在,返回參數bCreatedNewMutex爲true,不然爲false
            if (bCreatedNewMutex)  //若是名爲「HAHA」的互斥鎖不存在
            {
                Console.WriteLine("th1裝逼成功");
            }
            else
            {
                Console.WriteLine("th1裝逼失敗");
            }
        }
        public static void Thread2()
        {
            bool bCreatedNewMutex;
            Mutex m = new Mutex(true, "HAHA", out bCreatedNewMutex);
            if (bCreatedNewMutex)
            {
                Console.WriteLine("th2裝逼成功");
            }
            else
            {
                Console.WriteLine("th2裝逼失敗");
            }
        }

2、使用了垃圾回收線程

static void Main(string[] args)
        {
            Thread th1 = new Thread(Thread1);
            Thread th2 = new Thread(Thread2);
            th1.Start();
            th2.Start();
            Console.ReadKey();
        }
        public static void Thread1()
        {
            bool bCreatedNewMutex;
            Mutex m = new Mutex(true, "HAHA", out bCreatedNewMutex);
            if (bCreatedNewMutex)
            {
                Console.WriteLine("th1裝逼成功");
            }
            else
            {
                Console.WriteLine("th1裝逼失敗");
            }
        }
        public static void Thread2()
        {
            Thread.Sleep(1000);   //做用是等th1執行完畢,不然會報錯:因爲出現被放棄的 mutex,等待過程結束。
            GC.Collect();
            GC.WaitForPendingFinalizers();
            bool bCreatedNewMutex;
            Mutex m = new Mutex(true, "HAHA", out bCreatedNewMutex);
            m.WaitOne();
            if (bCreatedNewMutex)
            {
                Console.WriteLine("th2裝逼成功");
            }
            else
            {
                Console.WriteLine("th2裝逼失敗");
            }
            m.ReleaseMutex();
        }
相關文章
相關標籤/搜索