最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#多線程訪問資源的實現(xiàn)示例

 更新時間:2026年01月09日 10:04:19   作者:Winemonk  
C#中多線程訪問共享資源需要通過同步機制來保證線程安全,通過合理選擇同步機制,可以平衡性能與線程安全,下面就來介紹一下如何實現(xiàn),感興趣的可以了解一下

在 C# 中,多線程訪問共享資源需要通過同步機制來保證線程安全。以下是常見的解決方案及其適用場景:

1.1 鎖機制

  1. lock 關(guān)鍵字

    • 基于 Monitor 類,確保代碼塊同一時間僅一個線程進入。
    • 適用場景:簡單臨界區(qū)保護。
    private readonly object _lockObj = new object();
    lock (_lockObj) 
    {
        // 訪問共享資源
    }
    
  2. Monitor

    • 提供更靈活的控制(如超時機制)。
    Monitor.Enter(_lockObj);
    try { /* 操作資源 */ }
    finally { Monitor.Exit(_lockObj); }
    
  3. Mutex (互斥鎖)

    • 跨進程同步,適用于多進程共享資源。
    using var mutex = new Mutex(false, "GlobalMutexName");
    mutex.WaitOne();
    try { /* 操作資源 */ }
    finally { mutex.ReleaseMutex(); }
    
  4. SpinLock (自旋鎖)

    • 通過循環(huán)等待避免上下文切換,適用于極短臨界區(qū)。
    SpinLock spinLock = new SpinLock();
    bool lockTaken = false;
    spinLock.Enter(ref lockTaken);
    try { /* 操作資源 */ }
    finally { if (lockTaken) spinLock.Exit(); }
    

1.2 信號量機制

  1. Semaphore / SemaphoreSlim

    • 控制同時訪問資源的線程數(shù)量。
    SemaphoreSlim semaphore = new SemaphoreSlim(3); // 允許3個線程進入
    await semaphore.WaitAsync();
    try { /* 操作資源 */ }
    finally { semaphore.Release(); }
    
  2. ReaderWriterLockSlim

    • 讀寫分離鎖,允許多讀單寫。
    ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
    rwLock.EnterReadLock();  // 讀模式
    try { /* 讀取資源 */ }
    finally { rwLock.ExitReadLock(); }
    
    rwLock.EnterWriteLock(); // 寫模式
    try { /* 修改資源 */ }
    finally { rwLock.ExitWriteLock(); }
    

1.3 事件與信號

  1. ManualResetEvent / AutoResetEvent

    • 通過信號控制線程阻塞與喚醒。
    ManualResetEvent mre = new ManualResetEvent(false);
    mre.WaitOne();    // 等待信號
    mre.Set();        // 發(fā)送信號
    
  2. Barrier (屏障)

    • 同步多個線程到同一階段。
    Barrier barrier = new Barrier(3); // 等待3個線程到達
    barrier.SignalAndWait();          // 每個線程調(diào)用此方法
    
  3. CountdownEvent

    • 等待指定數(shù)量的操作完成。
    CountdownEvent cde = new CountdownEvent(3);
    cde.Signal();  // 每個線程完成后調(diào)用
    cde.Wait();    // 等待所有完成
    

1.4 原子操作

  1. Interlocked

    • 提供原子操作(如遞增、比較交換)。
    int value = 0;
    Interlocked.Increment(ref value); // 原子遞增
    

1.5 線程安全集合

  1. ConcurrentQueue / ConcurrentDictionary

    • 內(nèi)置線程安全的集合,避免手動同步。
    var queue = new ConcurrentQueue<int>();
    queue.Enqueue(1);
    if (queue.TryDequeue(out var item)) { /* 處理元素 */ }
    

1.6 避免共享狀態(tài)

  1. 不可變對象

    • 使用 readonly 或不可變集合(如 ImmutableList),確保數(shù)據(jù)不可變。
    var list = ImmutableList.Create<int>();
    list = list.Add(1); // 返回新實例,原數(shù)據(jù)不變
    
  2. 線程本地存儲

    • 使用 ThreadLocal<T>[ThreadStatic] 為每個線程創(chuàng)建獨立副本。
    ThreadLocal<int> threadLocal = new ThreadLocal<int>(() => 0);
    int localValue = threadLocal.Value;
    

1.7 異步與并行

  1. async/await 與異步鎖

    • 在異步代碼中使用 SemaphoreSlim.WaitAsync()。
    private SemaphoreSlim asyncLock = new SemaphoreSlim(1);
    await asyncLock.WaitAsync();
    try { /* 異步操作資源 */ }
    finally { asyncLock.Release(); }
    
  2. TPL (任務(wù)并行庫)

    • 使用 Parallel.ForTask 時確保資源安全。
    Parallel.For(0, 10, i => 
    {
        // 需要內(nèi)部同步機制
    });
    

1.8 選擇策略

  • 簡單臨界區(qū):優(yōu)先使用 lockMonitor。
  • 讀寫分離:使用 ReaderWriterLockSlim。
  • 高并發(fā)讀:不可變對象或并發(fā)集合。
  • 異步場景SemaphoreSlim.WaitAsync()。
  • 跨進程同步Mutex。

通過合理選擇同步機制,可以平衡性能與線程安全。

到此這篇關(guān)于C#多線程訪問資源的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C#多線程訪問資源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# FileStream實現(xiàn)大文件復(fù)制

    C# FileStream實現(xiàn)大文件復(fù)制

    這篇文章主要為大家詳細介紹了C# FileStream實現(xiàn)大文件復(fù)制,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • c#入門之實現(xiàn)簡易存款利息計算器示例

    c#入門之實現(xiàn)簡易存款利息計算器示例

    這篇文章主要介紹了c#入門之實現(xiàn)簡易存款利息計算器示例,需要的朋友可以參考下
    2014-04-04
  • C#?中?List?與?List?多層嵌套不改變原值的實現(xiàn)方法(深度復(fù)制)

    C#?中?List?與?List?多層嵌套不改變原值的實現(xiàn)方法(深度復(fù)制)

    這篇文章主要介紹了C#?中?List?與?List?多層嵌套不改變原值的實現(xiàn)方法,使用?BinaryFormatter?將原始?List?序列化為字節(jié)流,然后再反序列化得到新的?List,實現(xiàn)了深度復(fù)制,需要的朋友可以參考下
    2024-03-03
  • C#用表達式樹構(gòu)建動態(tài)查詢的方法

    C#用表達式樹構(gòu)建動態(tài)查詢的方法

    這篇文章主要介紹了C#用表達式樹構(gòu)建動態(tài)查詢的方法,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-12-12
  • C#實現(xiàn)語音播報功能

    C#實現(xiàn)語音播報功能

    這篇文章主要為大家詳細介紹了C#實現(xiàn)語音播報功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C#中實現(xiàn)插入、刪除Excel分頁符的方法

    C#中實現(xiàn)插入、刪除Excel分頁符的方法

    這篇文章主要給大家介紹了關(guān)于在C#中實現(xiàn)插入、刪除Excel分頁符的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • C#?讀寫編輯INI文件的操作

    C#?讀寫編輯INI文件的操作

    INI就是擴展名為"INI"的文件,其實他本身是個文本文件,可以用記事本打開,主要存放的是用戶所做的選擇或系統(tǒng)的各種參數(shù),這篇文章主要介紹了C#讀寫編輯INI文件的操作,需要的朋友可以參考下
    2023-05-05
  • C#?DataSet結(jié)合FlyTreeView實現(xiàn)顯示樹狀模型數(shù)據(jù)

    C#?DataSet結(jié)合FlyTreeView實現(xiàn)顯示樹狀模型數(shù)據(jù)

    NineRays.WebControls.FlyTreeView?是?9rays.net?推出的一款功能強大的樹狀模型數(shù)據(jù)顯示控件,本文主要介紹了如何使用其并結(jié)合?DataSet對象進行數(shù)據(jù)顯示,感興趣的可以了解下
    2024-04-04
  • 一文帶你了解C#操作MySql的方法

    一文帶你了解C#操作MySql的方法

    工作中大多數(shù)情況下用的都是 MySql 但一直沒有記錄,相關(guān)操作。這篇文章以便 MySql.Data 庫進行MySql操作,使用 C# 執(zhí)行 SQL 語句,造個輪子
    2023-03-03
  • C#二分查找算法實例分析

    C#二分查找算法實例分析

    這篇文章主要介紹了C#二分查找算法,實例分析了C#二分查找的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04

最新評論

崇阳县| 股票| 台湾省| 确山县| 九龙坡区| 团风县| 古蔺县| 鄢陵县| 龙州县| 江华| 永定县| 津市市| 崇义县| 元江| 江源县| 泾源县| 胶南市| 准格尔旗| 光泽县| 巧家县| 浦县| 洞头县| 高青县| 亚东县| 威海市| 维西| 南京市| 祁东县| 嘉黎县| 丰镇市| 仪征市| 龙陵县| 涿州市| 张家川| 东乡| 抚宁县| 故城县| 云南省| 随州市| 正镶白旗| 锡林浩特市|