狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

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

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

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

Monitor:

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

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

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

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

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

缺點(diǎn):相比 Monitor,性能開銷較大,因?yàn)樯婕暗较到y(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 實(shí)現(xiàn)了讀寫分離鎖,允許多個(gè)線程同時(shí)讀取共享資源,但只允許一個(gè)線程寫入共享資源。這種機(jī)制適用于讀多寫少的場(chǎng)景。

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

缺點(diǎn):相對(duì)復(fù)雜,可能會(huì)引起死鎖,不支持遞歸鎖。

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

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

缺點(diǎn):相對(duì)于其他機(jī)制,使用起來較為復(fù)雜,需要謹(jǐn)慎處理信號(hào)量的釋放。

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 是輕量級(jí)的信號(hào)量,與 Semaphore 類似,用于控制同時(shí)訪問共享資源的線程數(shù)量,但相比 Semaphore 更輕量級(jí)。

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

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

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# 中的關(guān)鍵字,用于在代碼塊級(jí)別實(shí)現(xiàn)互斥鎖,保護(hù)共享資源不被多個(gè)線程同時(shí)訪問。

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

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

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