Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;异步未来不会完成 我运行C++中的多个实例,我想用期货来分发,以减少程序的运行时间。主函数runSimulation获取一个Parameters对象并返回一个结果列表(精确地说是一个双精度向量)_C++_Asynchronous_Future - Fatal编程技术网

c++;异步未来不会完成 我运行C++中的多个实例,我想用期货来分发,以减少程序的运行时间。主函数runSimulation获取一个Parameters对象并返回一个结果列表(精确地说是一个双精度向量)

c++;异步未来不会完成 我运行C++中的多个实例,我想用期货来分发,以减少程序的运行时间。主函数runSimulation获取一个Parameters对象并返回一个结果列表(精确地说是一个双精度向量),c++,asynchronous,future,C++,Asynchronous,Future,如果我让一切按顺序运行,它会工作(但速度很慢)。如果我使用std::async,一些但不是所有未来的调用都会被卡住,并且不会返回任何内容 我的代码如下所示: const int l = 8; // number of simulations to run std::vector<Parameters> params = createRandomParameters(l); std::vector<std::vector<double>> simRes; si

如果我让一切按顺序运行,它会工作(但速度很慢)。如果我使用
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());
}
const int l=8;//要运行的模拟数
std::vector params=createRandomParameters(l);
std::向量simRes;
simRes.reserve(l);
//建立未来
向量期货;
期货储备(l);
//创造未来
对于(int i=0;i
请注意,只有部分期货挂起,而其他期货按预期工作(通过查看我的系统监视器及其CPU利用率可以观察到这一点)

顺序的 如果我用

for (int i = 0; i < l; ++i) simRes.push_back(runSimulation(params[i]));
for(int i=0;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中,我指定了<代码> -pTox< /Cord>标志,使用C++ 17(我也尝试了11和14…)。
你知道什么会导致这种行为,或者如何修复它,这样我就可以在不同的内核上运行模拟了吗?

好吧,你的模拟是否访问了任何全局变量,并且由于某些竞争条件而不知何故被卡住了?不,模拟只取决于参数。我看不出未来有什么理由挂起,你说你看到了它们在做“什么"。他们是否仍然在计算,因为您超额订阅了系统?磁盘是否受到了冲击,您是否写入了大量数据,而这正是这些模拟所等待的?参数的结构是什么?
runSimulation
做了什么?这个问题缺少MCVE,为了安全起见,您可以使用不同的启用nt sanitizers(UBSan、TSan、ASan、LSan等)?要冻结多线程问题,我通常使用调试器,等待调试器达到冻结状态,然后暂停调试。然后我可以检查所有线程中的所有堆栈跟踪,并查看线程冻结的位置。我通常在Qt Creator中执行此操作(如果您使用的是cmake,则很容易)。非常用户友好!您只需单击“暂停”,然后它会列出所有正在运行的线程,您可以逐个查看这些线程,并查看是否有任何线程在应该等待的函数处停止(互斥、未来等)。当然,您也可以查看内存状态。