C ++异步期货未完成

时间:2018-10-18 09:41:53

标签: c++ asynchronous future

我要在C ++中运行多个仿真实例,并希望使用期货进行分发以减少程序的运行时间。主函数runSimulation接受一个Parameters对象,并返回结果列表(精确的说是double的向量)。

如果我让所有程序按顺序运行,则可以运行(但速度很慢)。如果我使用std::async,则某些(但不是全部)将来的呼叫会卡住并且不返回任何内容。

我的代码如下:

const int l = 8; // number of simulations to run
std::vector<Parameters> params = createRandomParameters(l);

std::vector<std::vector<double>> simRes;
simRes.reserve(l);

// set up the futures
std::vector<std::future<std::vector<double>>> futures;
futures.reserve(l);

// create the futures
for (int i = 0; i < l; ++i) {
    futures.push_back(std::async(std::launch::async, &runSimulation, params[i]));
}

// get the results
for (auto &fut : futures) {
    simRes.push_back(fut.get());
}

请注意,只有一些期货挂起,而其他期货则按预期运行(这可以通过查看我的系统监视器及其CPU使用率来观察)。

顺序

如果我将Future-part替换为

for (int i = 0; i < l; ++i) simRes.push_back(runSimulation(params[i]));

一切正常(但是速度很慢),所以我想错误不在仿真功能中。

推迟

使用std::launch::deferred代替std::launch::async也可以,但是由于我顺序调用fut.get(),因此执行不是并行执行的。

std::launch排除在外(即futures.emplace_back(std::async(&runSimulation, params[i]));会导致与std::launch::async相同的行为。

不幸的是,我无法使用其他MWE函数重现此错误。

系统

我将Ubuntu 18.04.1与gcc 7.3.0一起使用。在CMake中,我指定-pthread标志并使用C ++ 17(我也尝试过11和14 ...)。

您知道什么可能导致此行为或如何解决此问题,以便我可以在不同的内核上运行仿真吗?

0 个答案:

没有答案