0
Concurrency::when_all function은 대기중인 모든 작업의 반환 값을 사용하여 std::vector<T>
을 반환합니다.concurrency :: when_all의 반환 벡터 FIFO의 결과가 있습니까?
벡터의 값은 어떤 순서로 정렬되어 있습니까? 아니면 작업이 완료된 순서입니까?
Concurrency::when_all function은 대기중인 모든 작업의 반환 값을 사용하여 std::vector<T>
을 반환합니다.concurrency :: when_all의 반환 벡터 FIFO의 결과가 있습니까?
벡터의 값은 어떤 순서로 정렬되어 있습니까? 아니면 작업이 완료된 순서입니까?
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();
}
내가 사용한 적이 PPL하지만, 마이크로 소프트의 제안은 C++ 표준의 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3558.pdf을 보는 것과 그리고 when_all 제안을 찾으면 입력 된 작업 순서와 동일한 결과 순서를 구현하는 데 기술적 인 어려움이 없다고 생각합니다. 그래서 그것은 FIFO가 아닌 것 같습니다. – user534498
FIFO가 아니라면 실제로 사용하는 것이 좋습니다. 그러나 그것을 의지하기 전에 어딘가에 문서화 된 것을보고 싶습니다. –