给定一个用C ++编写的Solver,以及一个通过JNI加载求解器实例的java类:
SolverLoader loader=SolverLoader.getInstance();
Solver solver=loader.getNewSolver();
solver.solve(...);
SolverLoader是一个单例类,可根据请求加载和返回Solver的实例。它本质上是一个对象工厂。每次调用getNewSolver()函数时,SolverLoader都会通过JNI在C ++端创建一个求解器的新实例,并将一个句柄传递回java端。这很方便,因为这允许我在java端有多个求解器:每个java侧求解器都维护一个C ++端唯一求解器实例的句柄。
简而言之,我可以这样做:
Solver solver1 = loader.getNewSolver(); solver1.solve(...);
Solver solver2 = loader.getNewSolver(); solver2.solve(...);
这些解算器中的每一个都具有完全分离的数据结构,因为C ++求解器实例之间没有重叠。
现在我想做的是并行调用“solver1.solve(...)
”和“solver2.solve(...)
”,即在单独的java线程中启动它们。我想知道这是否也能在C ++方面按预期工作。我应该对C ++端的多个线程做些什么吗?我担心即使在Java方面一切都是多线程的,在C ++方面它会像单线程应用程序一样,当solver2处于活动状态时solver1暂停,反之亦然?