發新話題
打印

[C#] 使用多執行緒時, Mutex 的使用方法

推到噗浪
推到臉書

[C#] 使用多執行緒時, Mutex 的使用方法

Mutex 互斥區,呼叫 WaitOne() 的任何執行緒如果先前沒有其他執行緒呼叫過,則直接進入互斥區,
但如果之前有其他執行緒呼叫過,則要等到之前呼叫過 WaitOnce() 的執行緒再次呼叫 ReleaseMutex() 之後,
才可以進入被包夾住的互斥區。

進入互斥區之後,該執行緒依然可以呼叫任意次數的 WaitOnce() ,但是離開互斥區之前,
則要呼叫相對應數量的 ReleaseMuTex() ,不然其他執行緒會苦苦等待,無法進入互斥區。
引用:

using System;
using System.Threading;
namespace MutexConsoleApp
{
    class Program
    {
        public static Mutex mut = new Mutex();
        private const int num_threads = 5;
        private const int num_ideas = 3;

        static void Main(string[] args)
        {
            
        
            Console.WriteLine("大魔神說....這次開會大家各提{0}個意見!",num_ideas);
            Thread[] myThread = new Thread[num_threads];
            for (int i = 1; i <= num_threads; i++)
            {
               
                myThread[i-1] = new Thread(new ThreadStart( MyThreadProc));
                myThread[i-1].Name = String.Format("職員 {0} 號", i);
                myThread[i-1].Start();
            }

            //等待每一位發言完畢
            for (int i = 1; i <= num_threads; i++)
            {
                myThread[i - 1].Join();
            }

            //大魔神作總結 ^^~
            Console.WriteLine();
            Console.WriteLine("大魔神說....很好,大家的意見我會參考!", num_ideas);
            Console.ReadLine();
        }

        private static void MyThreadProc()
        {
            //進入互斥區,搶得發言權,其他人只得等待
            mut.WaitOne();

            Console.WriteLine();
            Console.WriteLine("{0} :大家不要吵,先聽我說!", Thread.CurrentThread.Name);
            for (int i = 1; i <= num_ideas; i++)
            {
                Console.WriteLine("{0} :我得的第 {1} 個方案是‧‧‧※○◎●‧‧‧", Thread.CurrentThread.Name,i);
                Thread.Sleep(500);
            }
            Console.WriteLine("{0} :好啦,我說完啦,下一位請發言!", Thread.CurrentThread.Name);
            

            //離開互斥區,放棄發言權,下一個等待的人可以準備發言了
            mut.ReleaseMutex();
        }
    }
}
相關討論: http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=953623&SiteID=14

TOP

發新話題