2016-10-04 1 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)로 작업하고 종속 작업 전에 배치가 완료되도록 작업을 적절히 처리하고 있다면 스레드 안전 코드를 필요로하지 않습니다. thread는 작업 할 데이터 세트를 가져옵니다).

+0

@Guvante - "(각 스레드가 작업 할 자체 데이터 세트를 확보하도록 보장 함)." - 이것은 각 스레드가 자신의 AddAge 사본을 가지게된다는 것을 의미합니까? – BobSwanson

+1

@BobSwanson "AddAge 자신의 복사본"은 무엇입니까? 메소드 자체에는 인스턴스가 없습니다. 일반적으로 각 메소드에 대해 app-domain마다 실행되는 코드의 사본이 하나 있습니다 ... 로컬 변수 (샘플에 표시되지 않음)를 참조 할 수 있습니다. 실제로 메소드 변수 당 로컬 변수가 사용됩니다 ... –

+0

완벽한 : "로컬 변수는 메소드 호출 당 있습니다". 고맙습니다 – BobSwanson