2016-10-04 13 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; 
} 
  • 一人一人が自分の別のスレッドで「別に」更新され、もう1つは別とは何の関係もありませんので、ないAddAge()メソッドスレッドセーフでなければならない?
  • CLRはスレッドごとに「AddAge()」という独自のコピーを実行してスレッド間で分離しますか?
+2

「参照渡し」は、その行の参照で何も渡していません。また、あなたの 'AddAge'は数字を計算し、それを床に落とします。それは実際には(コンパイルされません)作成した番号で何もしません。 – Servy

+0

Personは参照型です。 AddAgeに到達すると、そのオブジェクトへの参照が送信されます。それはありませんか? – BobSwanson

+0

変数の値は参照値です。その変数は、参照ではなく値によって渡されます。 – Servy

答えて

2

スレッドセーフは、複数のスレッドから同じデータを変更することに関連しています。別のデータ(例:Parallel.ForEach)で作業していて、従属作業の前にバッチが完了するように作業を適切に実行している場合は、スレッドセーフなコードは必要ありません。スレッドは、独自のデータセットを取得します)。

+0

@Guvante - "(各スレッドが独自のデータセットを取得するようにすることによって)" - これは、各スレッドが独自のAddAgeのコピーを持つことを意味しますか? – BobSwanson

+1

@BobSwansonあなたは「AddAgeの独自のコピー」とは何ですか?メソッド自体にはインスタンスはありません。一般に、メソッドごとにapp-domainごとに実行されるコードのコピーが1つあります。ローカル変数(サンプルには表示されません)を参照している可能性があります。 ... –

+0

完璧: "ローカル変数はメソッド呼び出しごとです"。ありがとうございました – BobSwanson

関連する問題