打印异步线程ID随机工作

时间:2014-05-08 16:32:32

标签: multithreading c++11

我试图创建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;
}

结果是随机数量的线程打印到stdout - 有时只打印主要的id号,有时只有少数线程可以打印它们的ID,有时程序运行正常,例如

Main thread id: 
140648182765344

Main thread id: 
139913261897504
139913245943552
139913229158144
139913170409216

Main thread id: 
139704927008544
139704911054592
139704843912960

139704852305664
139704877483776

有什么样的种族我无法看到吗?是什么导致随机行为以及如何解决? 我应该修改程序来代替使用线程吗?

1 个答案:

答案 0 :(得分:2)

使用futures.resize代替futures.reserve。使用保留,期货会生成但不会插入到向量中。因此,您的foreach循环不会被执行,期货也不会等待。

或者,您可以使用back_inserterhttp://www.cplusplus.com/reference/iterator/back_inserter/)为您调整矢量大小:

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