2013-03-17 4 views
0

3 개의 작업을 병렬로 처리했습니다. 최소, 최대 및 평균 두 개의 숫자를 인쇄했습니다. 첫 번째 작업은 min 값을 두 번 인쇄하고 출력이 인접 해있을 것으로 예상합니다.C++의 parallel_invoke에서 예기치 않은 결과가 발생했습니다

int wmain() 
{ 

__int64 elapsed; 

    elapsed = time_call([&] 
    { 
     double a = 1.0; 
     double b = 5.0; 
     parallel_invoke(
      [&]{for(size_t i = 0; i < 2; ++i) 
       { 
        PrintMinValue(a, b); 
       }}, 
      [&]{PrintMaxValue(a, b);}, 
      [&]{PrintAvgValue(a, b);}); 

    }); 

    wcout << L"parallel time: " << elapsed << L" ms" << endl << endl; 
} 

이 프로그램을 여러 번 실행했습니다. 5, 3, 1, 1 또는 3, 1, 1, 5와 같은 모든 출력을 이해할 수 있습니다. 그러나 1, 5, 3, 1과 같은 일부 출력은 분명하지 않습니다. 이는 연속 블록에서 두 번 "1"(최소값)을 인쇄해야하는 첫 번째 작업이 분할됨을 의미합니다. 왜?

답변

0

wcout 또는 cout을 호출 할 때마다 '< <'연산자로 나눌 수 있습니다. 중단없이 전체 줄을 인쇄하려면 printf 스타일 출력을 사용하십시오.

+0

"인쇄"는 단지 예일뿐입니다. 예를 들어 할당을 사용할 수 있습니다. 결과는 동일합니다. –

0

코드가 병렬로 실행됩니다. 당신은 왜 블록이 연속적 일 것이라고 블록을 기대합니까? 병렬 프로그래밍에 대한 요점은이 보증을 제공한다는 것입니다. 그렇지 않으면 병렬이 아니지만 순차적입니다.

실행 순서를 유지하려면 critical section에 연속 블록을 래핑해야합니다.

+0

요점은 여기서 4 가지가 아니라 3 가지 작업이 병렬로 있다는 것입니다. –

+0

@EugeneZak 아무 것도 바뀌지 않습니다. 당신의 코드가 보장하는 ** only ** 것은 * first * 블록에있는 명령들이 동시에, 그리고 순차적으로 실행되지 않는다는 것입니다. 그러나 다른 지침과의 관계는 정의되어 있지 않습니다. 그것이 병렬 실행의 핵심입니다. –

+0

감사합니다. –

관련 문제