std::launch::async不同线程的数量是否正确?

std::launch::async does the number of distinct thread is correct?

我正在阅读 std::async 和 std::launch::async 并阅读该策略,可调用对象将在新线程中调用。

所以为了测试,我做了如下操作:

struct Wrapper
    {   
        void consume()
        {
             std::cout << "consume " << std::this_thread::get_id() << std::endl;
            std::for_each(arr.begin(), arr.end(), [](int val) {std::cout << val; });
        }

        bool produce()
        {
            std::cout << "produce " << std::this_thread::get_id() << std::endl;

            arr = { 1,0,3 };
            return true;
        }
    };


    int main()
    {

        std::cout << "main " << std::this_thread::get_id() << std::endl;

        Wrapper wrap;
        std::future<bool> fut = std::async(std::launch::async, &Wrapper::produce, &wrap);

        if (fut.get())
            std::async(std::launch::async, &Wrapper::consume, &wrap);

    }

因此,基于此,我将排除 3 个线程:

当我 运行 我得到的程序时 :

为什么std::async的两次调用有相同的线程ID??

谢谢。

标准说 std::async :

If launch​::​async is set in policy, calls INVOKE(DECAY_­COPY(std​::​forward<F>(f)), DECAY_­COPY(std​::​forward<Args>(args))...) as if in a new thread of execution [...]

Link

重要的部分是“好像在一个新的执行线程中”。实现必须表现得好像可调用对象是从新线程调用的,但实际上不需要 运行 在新线程上。提供这种余地是为了让标准库实现者可以重用相同的线程,也许是通过保持一个方便的线程池待命(threadpool 模式),这比每次调用创建和销毁威胁的响应更快std::async。虽然理论上实现也可以选择每次创建和销毁线程,或者做任何其他符合标准要求的事情。