LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

c# 多線程環(huán)境下控制對共享資源訪問的辦法

freeflydom
2024年7月30日 11:10 本文熱度 1074

Monitor:

定義:Monitor 是 C# 中最基本的同步機制,通過 Enter 和 Exit 方法來控制對共享資源的訪問。它提供了排他鎖的功能,確保在任何時刻只有一個線程可以訪問共享資源。

優(yōu)點:簡單易用,適合對臨界區(qū)進行粗粒度的同步控制。

缺點:只能實現(xiàn)排它鎖,不能實現(xiàn)讀寫鎖,性能相對較低。  

class Program

{

    static readonly object _lock = new object();

    static int _counter = 0;

    static void Main()

    {

        for (int i = 0; i < 10; i++)

        {

            new Thread(IncrementCounter).Start();

        }

        Console.ReadKey();

    }

    static void IncrementCounter()

    {

        Monitor.Enter(_lock);

        try

        {

            _counter++;

            Console.WriteLine($"Counter: {_counter}");

        }

        finally

        {

            Monitor.Exit(_lock);

        }

    }

}

 

Mutex:

定義:Mutex 是一個操作系統(tǒng)對象,用于在進程間共享,通過 WaitOne 和 ReleaseMutex 來控制對共享資源的訪問。它提供了進程間的同步能力。

優(yōu)點:可跨進程使用,適合在進程間進行同步。

缺點:相比 Monitor,性能開銷較大,因為涉及到系統(tǒng)調(diào)用。

class Program

{

    static Mutex _mutex = new Mutex();

    static int _counter = 0;

    static void Main()

    {

        for (int i = 0; i < 10; i++)

        {

            new Thread(IncrementCounter).Start();

        }

        Console.ReadKey();

    }

    static void IncrementCounter()

    {

        _mutex.WaitOne();

        _counter++;

        Console.WriteLine($"Counter: {_counter}");

        _mutex.ReleaseMutex();

    }

}

 

ReaderWriterLockSlim:

定義:ReaderWriterLockSlim 實現(xiàn)了讀寫分離鎖,允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。這種機制適用于讀多寫少的場景。

優(yōu)點:適合讀多寫少的場景,提高了并發(fā)性能。

缺點:相對復雜,可能會引起死鎖,不支持遞歸鎖。

class Program

{

    static ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim();

    static int _counter = 0;

    static void Main()

    {

        for (int i = 0; i < 5; i++)

        {

            new Thread(ReadCounter).Start();

            new Thread(IncrementCounter).Start();

        }

        Console.ReadKey();

    }

    static void ReadCounter()

    {

        _rwLock.EnterReadLock();

        Console.WriteLine($"Counter: {_counter}");

        _rwLock.ExitReadLock();

    }

    static void IncrementCounter()

    {

        _rwLock.EnterWriteLock();

        _counter++;

        Console.WriteLine($"Counter incremented to: {_counter}");

        _rwLock.ExitWriteLock();

    }

}

 

Semaphore:

定義:Semaphore 是一個信號量,用于控制同時訪問共享資源的線程數(shù)量。通過 WaitOne 和 Release 方法,可以控制訪問資源的線程數(shù)量。

優(yōu)點:可以控制多個線程同時訪問共享資源的數(shù)量,靈活性較高。

缺點:相對于其他機制,使用起來較為復雜,需要謹慎處理信號量的釋放。

class Program

{

    static Semaphore _semaphore = new Semaphore(2, 2); // Allow 2 threads to access the resource simultaneously

    static int _counter = 0;

    static void Main()

    {

        for (int i = 0; i < 5; i++)

        {

            new Thread(IncrementCounter).Start();

        }

        Console.ReadKey();

    }

    static void IncrementCounter()

    {

        _semaphore.WaitOne();

        _counter++;

        Console.WriteLine($"Counter: {_counter}");

        _semaphore.Release();

    }

}

 

SemaphoreSlim:

定義:SemaphoreSlim 是輕量級的信號量,與 Semaphore 類似,用于控制同時訪問共享資源的線程數(shù)量,但相比 Semaphore 更輕量級。

優(yōu)點:相比 Semaphore,SemaphoreSlim 的開銷更小,適用于資源訪問頻繁的場景。

缺點:與 Semaphore 相比,功能上略有限制,例如沒有 Release(Int32) 方法,只能遞增信號量一個單位。

class Program

{

    static SemaphoreSlim _semaphore = new SemaphoreSlim(2, 2); // Allow 2 threads to access the resource simultaneously

    static int _counter = 0;

    static void Main()

    {

        for (int i = 0; i < 5; i++)

        {

            new Thread(IncrementCounter).Start();

        }

        Console.ReadKey();

    }

    static void IncrementCounter()

    {

        _semaphore.Wait();

        _counter++;

        Console.WriteLine($"Counter: {_counter}");

        _semaphore.Release();

    }

}

 

lock:

定義:lock 是 C# 中的關鍵字,用于在代碼塊級別實現(xiàn)互斥鎖,保護共享資源不被多個線程同時訪問。

優(yōu)點:簡單易用,適合對臨界區(qū)進行細粒度的同步控制,編寫起來比較方便。

缺點:只能用于單線程內(nèi)部的同步,不能跨越線程或進程,如果不小心使用會導致死鎖。

class Program

{

    static readonly object _lock = new object();

    static int _counter = 0;

    static void Main()

    {

        for (int i = 0; i < 5; i++)

        {

            new Thread(IncrementCounter).Start();

        }

        Console.ReadKey();

    }

    static void IncrementCounter()

    {

        lock (_lock)

        {

            _counter++;

            Console.WriteLine($"Counter: {_counter}");

        }

    }

}


轉(zhuǎn)自https://www.cnblogs.com/INetIMVC/p/18330485


該文章在 2024/7/30 11:10:12 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結(jié)合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲欧美日韩文无线码 | 中文字幕免费视频 | 一级中文字幕在线播放 | 色8欧美日韩国产无线码 | 日韩欧美视频在线 | 熟女丰满少妇精品一区二区 |