C# 中使用鎖防止多線程沖突


在編程的時候經常會用到多線程,有時候如果多線程操作同一個資源就會導致沖突,.NET提供了多種方法來防止沖突發生,這里講下Mutex

該類位於System.Threading命名空間,常用的方式是這樣:

var mutex = new Mutex(true, "Test", out var flag);

參數分別是:

1:給調用線程賦予互斥體的初始所屬權

2:鎖名稱

3:如果調用線程已被授予互斥體的初始所屬權,則返回true

notice:這個鎖的有效范圍是全系統

也就是說不同進程之間如果鎖名稱相同會互相影響.使用時需要注意這點.

代碼:

        static void Main(string[] args)
        {
            var mutex = new Mutex(true, "Test", out var flag);
            {
                Task.Factory.StartNew(Th);

                Console.WriteLine(flag.ToString());
                Console.WriteLine("按任意鍵繼續:");

                Console.ReadKey(true);
                mutex.ReleaseMutex();
            }
            Console.ReadKey(true);
        }
        
        private static void Th()
        {
            var mutex = new Mutex(true, "Test", out var flag);
            {
                if (!flag)
                {
                    //等待3s互斥鎖
                    flag = mutex.WaitOne(3000, true);
                    if (flag)
                    {
                        Console.Write(1);
                    }
                    else
                    {
                        Console.Write("沒有得到互斥鎖,嘗試無限等待...");
                        //無限等待互斥鎖
                        mutex.WaitOne();
                        Console.Write(1);
                    }
                }
                mutex.ReleaseMutex();
            }
        }

 


免責聲明!

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



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