2012-07-23 2 views
4
에 루프

나는이 루프의 일부는 계산의 측면에서 꽤 많이 사용하고 난 그냥 병렬를 사용하여 변경 기존의 구문변경 foreach 문은 Parallel.ForEach 이상한 버그

foreach(x in xs) {....} 

를 사용하여 쓴 여러 루프가 구문은 다음과 같습니다.

Parallel.ForEach(x, xs => {...}); 

성능이 크게 향상되었습니다. 이제 제 질문은 이것입니다 : 병렬 멀티 쓰레딩을 사용하여 버그를 도입 했습니까? 스레드 안전성이 복잡하고 이상한 버그를 만들 수 있다고 읽었습니다. 나는 무엇에 대해 염려해야 하는가?

+4

코드가 스레드로부터 안전한지 여부를 알지 못하고 루프를 변경하는 경우 * 염려해야합니다! * 코드가 병렬로 실행되므로 기본적으로 병렬 루프간에 데이터를 공유 할 수 없습니다 . –

+0

@BrianRasmussen :하지 말아야 할 일의 예를 보여줄 수 있습니까? – frenchie

+0

루프 동안 공유 데이터 읽기/쓰기. –

답변

3

공유 상태에 액세스하면 대부분 원하는 결과가 생성되지 않습니다. 간단한 예 : 여러 스레드가 sum 읽기/쓰기 때문에

int sum = 0; 
for (int i = 0; i < 1000000; i++) 
{ 
    sum++; 
} 

변경이 sum

Parallel.For(0, 1000000, i => { sum++; }); 

에 당신이 볼 수는 어떤 임의의 값을가집니다.

업데이트를 잠그면 문제는 해결되지만 본질적으로 작업을 다시 순차 작업으로 바꿀 것입니다.

루프에서 발생하는 모든 작업이 안전한지 확인해야합니다.

Microsoft Patterns and Practices는이 모든 것을 설명하는 a book을 수행했습니다. 병렬 루프를 사용하도록 코드를 변경하기 전에 체크 아웃해야합니다.

2

분명히 말해서 - 반복/루프 코드를 게시하십시오.

그러나 일반적으로 반복은 서로 독립적이어야하며 공유 상태를 피하십시오. 병렬 리소스 반복에 걸친 모든 공유 리소스는 버그를 유발할 수 있습니다.

계산이 다른 계산이나 병렬 작업 또는 TPL 작업 체인을 사용하는 것이 더 좋은 경우에도 공유 된 스레드 간 자원을 피하는 데 도움이됩니다. infromation 샘플과 패턴

더/안티 패턴은 무료 마이크로 소프트 책자에서 설명하는 좋은 : 이해와 여기

http://www.microsoft.com/en-us/download/details.aspx?id=19222 그것을 다운로드 .NET 프레임 워크 4

와 병렬 패턴을 적용 : 병렬 프로그래밍을위한 패턴