簡體   English   中英

如何在c#上創建對象Threadsafe?

[英]How to make objects Threadsafe on c#?

我有一個在大多數情況下需要線程的應用程序。 大多數情況下,我會遇到錯誤或錯誤的值,因為對象在每個線程執行之前都已更新。

您是否有任何建議如何使對象是線程安全的並確保對象具有正確的每個線程? 我應該將變量static嗎?

您應該做的第一件事是繪制一個您想要通過多線程解決的問題的Happens-Before圖 如果你無法繪制你的設計,那就太復雜了。

例如,這是一個方法的先發生的圖形,它采用兩個int數組並輸出所有元素的總和。

在此輸入圖像描述

一旦你有了事先發生的圖表,很容易看到在其他事情發生之前會發生什么,但更重要的是它會向你展示在其他事情發生之前不會發生的事情。

在此示例中,您可以同時獲取array1和array2的總和。 你也可以在sum2的同時獲得sum1,因為它們不相互依賴。 將總和添加到TotalSum1可以按任意順序完成(但是您需要鎖定添加步驟,因為您不能同時執行添加操作)。

C#.net 4.0具有許多用於並行編程的有用功能。

我推薦這本書使用Microsoft .Net進行並行編程 - 只需使用左側的書簽進行導航即可。 它涵蓋了Loops,Tasks,Aggregation,Futures和Pipelines的並行模式。

在上面的例子中,我將使用Task1來獲取Array1和Task2來獲取Array2,然后在這兩個中我將使用內置在Parallel.For循環中的聚合模式來獲取數組和,我需要使用鎖或者是一個Interlocked.Add來解釋subTotals,然后等待任務完成並返回結果。

有用的模式:

  • 任務
  • 平行循環
  • 生產者/消費者
  • 管道
  • 工作列表
  • MapReduce的

有用的工具:

  • 任務並行庫
    • 的Parallel.For
    • Parallel.Foreach,
    • 任務
  • PLINQ
  • 並發DataStructures
    • ConcurrentQueue
    • 等等
  • 鎖定
    • 'lock'關鍵字
    • 監控(與'鎖'功能相同)
    • 信號燈
    • 自旋鎖
    • 讀/寫鎖
  • 硬件原子操作
    • Interlocked.Increment
    • Interlocked.Add
    • Interlocked.CompareAndSwap
    • 分配機器字長變量,如int
  • 消息傳遞
    • MPI
    • 障礙
    • 等等

基本上,首先要了解您的問題,然后選擇工具/模式來解決它。

查看使用lock語句獲取使線程安全所需的任何資源。

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

class Account
{
    decimal balance;
    private Object thisLock = new Object();

    public void Withdraw(decimal amount)
    {
        lock (thisLock)
        {
            if (amount > balance)
            {
                throw new Exception("Insufficient funds");
            }
            balance -= amount;
        }
    }
}

這將是我的第一步。 您還可以查看Monitor類。

http://msdn.microsoft.com/en-us/library/system.threading.monitor.aspx

這些是在並發操作期間可以保護資源的兩種基本方法。 還有許多其他方法,如互斥,sempahores,條件讀/寫鎖等。

從這里開始: 同步數據以進行多線程處理

基本上,您需要使用互斥鎖 在.NET中,每個對象都可以充當互斥鎖,因此您可以在任何對象上使用lock關鍵字來確保互斥。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM