1. 程式人生 > >C#多線程的用法6-線程間的協作Mutex

C#多線程的用法6-線程間的協作Mutex

sta art 參數 mar class 多線程 參與 狀態 pre

Mutex在線程協作的過程中起互斥的左右,效果與線程鎖類似。

/// <summary>
        /// 多線程協作-Mutex
        /// </summary>
        private static void MultiThreadSynergicWithMutex()
        {
           
            Mutex mutex = new Mutex(true);
            
            Thread thread1 = new Thread(() =>
            {
                mutex.WaitOne();
                for (var i = 0; i < 5; i++)
                {
                    Console.WriteLine(i);
                }
                mutex.ReleaseMutex();
            });
            Thread thread2 = new Thread(() =>
            {
                mutex.WaitOne();
                for (var i = 5; i < 10; i++)
                {
                    Console.WriteLine(i);
                }
                mutex.ReleaseMutex();
            });

            thread1.Start();
            thread2.Start();
            mutex.ReleaseMutex();
        }

說明:

1、initiallyOwned表示創建mutex的線程是否擁有該互斥體。true表示創建線程擁有互斥鎖,只有在創建線程中調用ReleaseMutex釋放後,其他等待線程才能參與搶奪互斥體的活動。false表示互斥鎖體於與空閑狀態,其他等待互斥鎖的線程立即參與到搶奪互斥鎖的活動中去。

2、在上面程序中創建mutex時使用true參數,故在啟動其他線程後必須執行mutex.ReleaseMutex(),如果不釋放mutex,則其他線程將一直等待下去。

3、mutex.WaitOne()與mutex.ReleaseMutex()要像 { } 一樣配對使用,否則將出現 "由於出現被放棄的 mutex,等待過程結束" 的異常

4、mutex與monitor相比,沒有暫時釋放的功能;因此mutex一經釋放,原釋放資源的線程也將重新參與新一輪對mutex的爭奪過程。

5、mutex除了可用於線程同步外還可用於進程間同步,這些知識有待你去發掘........

C#多線程的用法6-線程間的協作Mutex