c# 多線程 --Mutex(互斥鎖)


互斥鎖(Mutex)

互斥鎖是一個互斥的同步對象,意味着同一時間有且僅有一個線程可以獲取它。

互斥鎖可適用於一個共享資源每次只能被一個線程訪問的情況

 函數:

//創建一個處於未獲取狀態的互斥鎖

Public Mutex();

//如果owned為true,互斥鎖的初始狀態就是被主線程所獲取,否則處於未獲取狀態

 Public Mutex(bool owned);

 如果要獲取一個互斥鎖。應調用互斥鎖上的WaitOne()方法,該方法繼承於Thread.WaitHandle類

它處於等到狀態直至所調用互斥鎖可以被獲取,因此該方法將組織住主調線程直到指定的互斥鎖可用,如果不需要擁有互斥鎖,用ReleaseMutex方法釋放,從而使互斥鎖可以被另外一個線程所獲取。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
 
namespace MyTTCon
{
    class shareRes
    {
        public static int count = 0;
        public static Mutex mutex = new Mutex();
    }
 
    class IncThread
    {
        int number;
        public Thread thrd;
        public IncThread(string name, int n)
        {
            thrd = new Thread(this.run);
            number = n;
            thrd.Name = name;
            thrd.Start();
        }
        void run()
        {
            Console.WriteLine(thrd.Name + "正在等待 the mutex");
            //申請
            shareRes.mutex.WaitOne();
            Console.WriteLine(thrd.Name + "申請到 the mutex");
            do
            {
                Thread.Sleep(1000);
                shareRes.count++;
                Console.WriteLine("In " + thrd.Name + "ShareRes.count is " + shareRes.count);
                number--;
            } while (number > 0);
            Console.WriteLine(thrd.Name + "釋放 the nmutex");
            //  釋放
            shareRes.mutex.ReleaseMutex();
        }
    }
    class DecThread
    {
        int number;
        public Thread thrd;
        public DecThread(string name, int n)
        {
            thrd = new Thread(this.run);
            number = n;
            thrd.Name = name;
            thrd.Start();
        }
        void run()
        {
            Console.WriteLine(thrd.Name + "正在等待 the mutex");
            //申請
            shareRes.mutex.WaitOne();
            Console.WriteLine(thrd.Name + "申請到 the mutex");
            do
            {
                Thread.Sleep(1000);
                shareRes.count--;
                Console.WriteLine("In " + thrd.Name + "ShareRes.count is " + shareRes.count);
                number--;
            } while (number > 0);
            Console.WriteLine(thrd.Name + "釋放 the nmutex");
            //  釋放
            shareRes.mutex.ReleaseMutex();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            IncThread mthrd1 = new IncThread("IncThread thread ", 5);
            DecThread mthrd2 = new DecThread("DecThread thread ", 5);
            mthrd1.thrd.Join();
            mthrd2.thrd.Join();
        }
    }
}

 原文鏈接:http://www.cnblogs.com/tianzhiliang/archive/2010/09/01/1814822.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM