2016-10-04 48 views
-1

具有如下:並行執行調用方法線程安全

List<Person> persons = // list of persons 
Parallel.ForEach(persons, (i) => { 
     AddAge(i); 
}); 

// Does this method needs to be thread safe? 
// Why? 
public void AddAge(Person person) 
{ 
    // Multiple threads execute here at once. However they're 
    // working with their own "person" object, therefore  
    // each thread won't corrupt others "person" object - is this assumption correct? 
    person.Age =+ 10; 
} 
  • 由於每個人得到更新的「分開」,自己單獨的線程和一個無關另一個,確實AddAge()方法必須是線程安全的?
  • CLR是否爲每個線程執行它自己的「AddAge()」副本 - 使它在線程之間分開?
+2

'通過引用'你沒有通過任何引用該行的任何東西。另外,你的'AddAge'計算一個數字,然後將它放在地板上;它實際上並沒有對它創建的數字做任何事情(不會編譯)。 – Servy

+0

人是一種參考類型。所以當它到達AddAge時,它會發送一個對該對象的引用。不是嗎? – BobSwanson

+0

變量的值是一個參考。該變量是通過值傳遞,而不是通過引用。 – Servy

回答

2

線程安全涉及修改多個線程中的相同數據。如果您正在使用單獨的數據(例如您的Parallel.ForEach)並正確地對工作進行操作,以便在從屬工作之前完成批處理,則您不需要線程安全代碼,因爲您正在執行方法之外的線程安全性(通過確保每個線程獲取自己的一組數據來處理)。

+0

@Guvante - 「(通過確保每個線程獲得自己的一組數據來處理)」。 - 這意味着每個線程都會擁有自己的AddAge副本? – BobSwanson

+1

@BobSwanson你有什麼鬃毛「AddAge的副本」?方法本身沒有實例 - 通常每個方法都有一個運行在每個應用程序域的代碼副本...您可能指的是局部變量(在您的示例中未顯示) - 實際上每個方法調用的局部變量... –

+0

完美:「局部變量是每個方法調用」。謝謝 – BobSwanson