[英]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,然后等待任務完成並返回結果。
有用的模式:
有用的工具:
基本上,首先要了解您的問題,然后選擇工具/模式來解決它。
查看使用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.