欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

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

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

Monitor:

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

優點:簡單易用,適合對臨界區進行粗粒度的同步控制。

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

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 是一個操作系統對象,用于在進程間共享,通過 WaitOne 和 ReleaseMutex 來控制對共享資源的訪問。它提供了進程間的同步能力。

優點:可跨進程使用,適合在進程間進行同步。

缺點:相比 Monitor,性能開銷較大,因為涉及到系統調用。

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 實現了讀寫分離鎖,允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。這種機制適用于讀多寫少的場景。

優點:適合讀多寫少的場景,提高了并發性能。

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

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 是一個信號量,用于控制同時訪問共享資源的線程數量。通過 WaitOne 和 Release 方法,可以控制訪問資源的線程數量。

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

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

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 類似,用于控制同時訪問共享資源的線程數量,但相比 Semaphore 更輕量級。

優點:相比 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# 中的關鍵字,用于在代碼塊級別實現互斥鎖,保護共享資源不被多個線程同時訪問。

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

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

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}");

        }

    }

}


轉自https://www.cnblogs.com/INetIMVC/p/18330485


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