2014-01-09 2 views
0

Concurrency::when_all function은 대기중인 모든 작업의 ​​반환 값을 사용하여 std::vector<T>을 반환합니다.concurrency :: when_all의 반환 벡터 FIFO의 결과가 있습니까?

벡터의 값은 어떤 순서로 정렬되어 있습니까? 아니면 작업이 완료된 순서입니까?

+0

내가 사용한 적이 PPL하지만, 마이크로 소프트의 제안은 C++ 표준의 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3558.pdf을 보는 것과 그리고 when_all 제안을 찾으면 입력 된 작업 순서와 동일한 결과 순서를 구현하는 데 기술적 인 어려움이 없다고 생각합니다. 그래서 그것은 FIFO가 아닌 것 같습니다. – user534498

+0

FIFO가 아니라면 실제로 사용하는 것이 좋습니다. 그러나 그것을 의지하기 전에 어딘가에 문서화 된 것을보고 싶습니다. –

답변

2

Microsoft 설명서에서 찾을 수 없습니다. 간단한 테스트를했는데, 스레드는 어떻게 든 무작위 순서로 끝나지만, 최종 출력은 1,2,3,4,5입니다. 랜덤로드가 다른 100 개의 스레드를 만들 수 있습니다. 결과는 변경되지 않습니다. 결론은이 가정에서 안전하게 사용할 수 있다는 것입니다.

#include <ppltasks.h> 
#include <array> 
#include <iostream> 

using namespace concurrency; 
using namespace std; 

int wmain() 
{ 
    // Start multiple tasks. 
    array<task<int>, 5> tasks = 
    { 
     create_task([]() -> int { 
      for (int i = 0; i < 100; i++) { 
       wcout << "thread 1: " << i << endl; 
      } 
      return 1; 
     }), 
     create_task([]() -> int { 
      for (int i = 0; i < 100; i++) { 
       wcout << "thread 2: " << i << endl; 
      } 
      return 2; 
     }), 
     create_task([]() -> int { 
      for (int i = 0; i < 100; i++) { 
       wcout << "thread 3: " << i << endl; 
      } 
      return 3; 
     }), 
     create_task([]() -> int { 
      for (int i = 0; i < 100; i++) { 
       wcout << "thread 4: " << i << endl; 
      } 
      return 4; 
     }), 
     create_task([]() -> int { 
      for (int i = 0; i < 100; i++) { 
       wcout << "thread 5: " << i << endl;; 
      } 
      return 5; 
     }) 
    }; 

    auto joinTask = when_all(begin(tasks), end(tasks)).then([](vector<int> results) 
    { 
     for_each(begin(results), end(results), [](int a) { 
      wcout << a << endl; 
     }); 
    }); 

    joinTask.wait(); 
}