Multithreading 打印异步线程ID是随机工作的

Multithreading 打印异步线程ID是随机工作的,multithreading,c++11,Multithreading,C++11,我正在尝试创建10个异步线程,每个线程都打印其线程ID: #include <iostream> #include <thread> #include <future> #include <chrono> #include <vector> #include <algorithm> #include <mutex> std::mutex printMutex; class GenerateAsyncs { p

我正在尝试创建10个异步线程,每个线程都打印其线程ID:

#include <iostream>
#include <thread>
#include <future>
#include <chrono>
#include <vector>
#include <algorithm>
#include <mutex>

std::mutex printMutex;

class GenerateAsyncs
{
public:
    explicit GenerateAsyncs () {};
    std::future<void> operator()() 
    {
        return std::async(std::launch::async, []
        {
            std::lock_guard<std::mutex> lockGuard(printMutex);
            std::cout << std::this_thread::get_id() << '\n';
        });
    };
};

int main()
{
    std::cout << "Main thread id: \n" << std::this_thread::get_id() << '\n';

    std::vector<std::future<void>> futures;
    futures.reserve(10);

    std::generate_n(begin(futures), 10, GenerateAsyncs());

    for_each(begin(futures), end(futures), [](std::future<void>& future)
    {
        future.wait();
    });
    std::cout << '\n';
    return 0;
}
有什么我看不见的种族吗?是什么导致了随机行为以及如何修复它?
我应该修改程序以使用线程吗?

使用
futures.resize
而不是
futures.reserve
。使用reserve,将生成期货,但不会将其插入到向量中。因此,不会执行foreach循环,也不会等待未来

或者,您可以使用
back\u插入器
(),它将为您调整向量的大小:

std::generate_n(std::back_inserter(futures), 10, GenerateAsyncs());

我希望生成n来填充未来向量。为什么它在添加新的未来时不递增?vector::reserve()不创建元素,也不更改
end
迭代器。它只是确保有足够的空间给他们。vector::resize创建元素并调整大小。但是为什么不使用从异步获得的连续未来填充向量呢?我使用reserve来防止重新定位向量,但希望generate\n用实际值填充它。generate\n不会修改向量的迭代器。具体来说,它不会更改大小和结束迭代器。它只是给连续的位置赋值,从你给它的位置开始。哦,我明白了。我错过了。在这种情况下,发出警告信息会很有帮助。谢谢
std::generate_n(std::back_inserter(futures), 10, GenerateAsyncs());