并发::when_all的结果是 FIFO 吗?

Are results of concurrency::when_all's return vector FIFO?

本文关键字:FIFO 结果是 all when 并发      更新时间:2023-10-16

Concurrency::when_all 函数返回一个std::vector<T>,其中包含它等待的所有任务的返回值。

向量中的值是按任何类型的顺序排列,还是按任务完成的顺序排列?

我也无法从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();
}