-2

저는 Parallel.foreach를 500 회 이상 반복합니다. 나는 일관성 출력에 직면하고있다Parallel.ForEach의 불일치

Parallel.ForEach(indexes, (index) => 
{ 

//parentCreation with index object 
parent=create(index); 

//call of function to create children 
createChildrenOfType1(parent); 
createChildrenOfType2(parent); 
}); 

: 뭔가처럼

내 루프입니다. 부모는 올바르게 작성되지만 하위 작성은 일관성이 없습니다. 가끔은 자식이 생성되지 않는 경우가 있습니다. 자식 만들기 메서드는 for 루프를 사용하여 100 개의 자식을 만들 수 있습니다.

부모 생성을 위해 병렬 foreach를 사용하는 동안 어떻게 내 자식 만들기를 일관되게 만들 수 있습니까? 당신의 Parent 객체를 가정

+3

당신은 그 생성 메소드의 구현을 보여 주어야 할 것이라고 생각합니다. –

+4

스레드 안전하지 않은 객체가 스레드가 안전하지 않습니다 – milleniumbug

+2

GTA를 사용 해본 적이 있고 다트를 너무 많이 마셔 본 적이 있다면 멀티 스레드 환경에서 안전하지 않은 객체를 사용할 때와 같은 느낌이들 것입니다. 그것은 단지 정상적인 것이 아닙니다. –

답변

1

여기에서 볼 수있는 한 가지 문제점은 Parallel.ForEach 코드 블록 내에서 선언되지 않은 변수를 수정한다는 것입니다.이 경우 블록을 잠 가야합니다.

Parallel.ForEach(indexes, (index) => 
{ 

//parentCreation with index object 
lock (parent) 
{ 
    parent=create(index); 
} 


lock (childrenDefinedElseWhere) 
{ 
    //call of function to create children 
    createChildrenOfType1(parent); 
    createChildrenOfType2(parent); 
} 
}); 

잠금을 사용하면 스레드가 올바르게 동기화됩니다.

+1

감사합니다. 그렇습니다. 일부 변수는 병렬 for 루프에서 초기화되어 불일치의 원인이되었습니다. – Akanksha

1

있는 List<Child> Children하고 createChildrenOfTypeX 기능은 Parent.Children 목록에 새 자식을 추가하고, 그 createChildrenOfTypeX는 다음 목록 구현이 스레드 안전해야하는 코드의 병렬 세트를 실행; 표준 System.Collections.Generic 구현은 스레드로부터 안전하지 않습니다.

또한 새로 인스턴스화 된 부모를 추가하는 Parent의 외부 컬렉션이있는 경우이 또한 스레드로부터 안전해야합니다. 그렇지 않으면 부모 인스턴스도 손실 될 수 있습니다.