我试图创建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
有什么样的种族我无法看到吗?是什么导致随机行为以及如何解决? 我应该修改程序来代替使用线程吗?
答案 0 :(得分:2)
使用futures.resize
代替futures.reserve
。使用保留,期货会生成但不会插入到向量中。因此,您的foreach循环不会被执行,期货也不会等待。
或者,您可以使用back_inserter
(http://www.cplusplus.com/reference/iterator/back_inserter/)为您调整矢量大小:
std::generate_n(std::back_inserter(futures), 10, GenerateAsyncs());