Являются ли результаты параллелизма:: return_all вектором возврата FIFO?

Функция Concurrency::when_all возвращает std::vector<T> с возвращаемыми значениями всех задач, которые он ожидал.

Находятся ли значения в векторе в каком-либо порядке или в порядке выполнения задач?

1 ответ

Решение

Я не могу найти из документации 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();
}
Другие вопросы по тегам