并行创建和运行多个求解器实例



我想在多个线程中运行多个求解器并最终处理。我目前正在运行一个 for 循环并创建如下所示的线程:

for (...) {
pthread_t pid;
Args args;
args.solver = solver???
pthread_create(&pid, NULL, &func, (void*)&args);
}

在定义solver时,我尝试了几个选项,但没有一个奏效。

首先,我尝试调用const auto solver = drake::solvers::MakeSolver(solver_id);,然后将solver.get()传递到每个线程的参数中。这成功地编译和运行,但我在drake::solvers::SnoptSolver::DoSolve中得到了一些晦涩的失败terminate called recursively.我看到 MakeSolver 似乎在kKnownSolvers中定义的单个求解器实例周围返回一个唯一的 ptr,因此线程可能在同一求解器实例上调用DoSolve,从而导致此问题。

然后,我尝试创建求解器的多个实例。调用StaticSolverInterface::Make<SnoptSolver>()不起作用,因为它是在未命名的命名空间中定义的,因此只能在该文件中访问。调用const auto solver = drake::solvers::MakeSolver(solver_id);并复制solver指向的SolverInterface是不可能的,因为SolverInterface不可移动或复制。

我正在做的事情可能吗?如果是这样,我该如何实现?

多次调用drake::solvers::MakeSolver(solver_id)并将每个调用都提供给不同的线程应该可以正常工作。 它每次返回不同的对象,不共享任何内容。

同样,重复调用make_unique<SnoptSolver>或类似的东西也应该有效,如果你可以硬编码你想要的求解器而不是按id

terminate错误消息可能是未经处理的异常。 通常,当您创建线程时,您需要在直接入口点内放置一个try { } catch () {};您不希望异常离开线程。

另外,我强烈建议std::thread如果你在C++;pthread API又旧又臭。

最新更新