已更新
(因为我的原始条件在经过多次测试后不再合适,我更改了代码示例以更好地描述问题)
长话短说,在我的C ++应用程序的线程中打开的Matlab引擎在线程结束后意外关闭而没有明确调用engClose()
。我希望任何人都可以帮助我解决这个谜团,并找到一种更好地控制引擎的方法。
详情如下
我知道Matlab Engine API不是线程安全的。但对于Windows,我用engOpenSingleUse()
来计算,多线程可能仍然可以实现。这里的想法是让不同对象(类)的计算在同一个线程中运行在同一个Matlab计算引擎上。然后,每个线程访问其自己的接口,该接口在这些对象中包含有效的Matlab引擎指针。因此,避免我的多线程应用程序中的冲突。然后我碰到了这个问题。线程结束后,Mmatlab引擎自动关闭,而不调用engClose()
。
出于测试目的,我希望那些Matlab引擎保持打开状态,这样我就可以直接在控制台中输入代码来执行其他检查和操作。
经过多次测试后,我终于意识到这与我如何实现Matlab引擎无关,因为只是在线程中调用engOpen()
或engOpenSingleUse()
会导致此问题。
以下是我用于测试的示例
#include<memory>
#include<thread>
#include<map>
#include<engine.h>
void callback() {
Engine* ep = engOpenSingleUse(NULL,NULL,NULL);
}
int main(int argc, char *argv[])
{
std::shared_ptr<std::thread> thread1;
thread1 = std::make_shared<std::thread>(&callback);
std::shared_ptr<std::thread> thread2;
thread2 = std::make_shared<std::thread>(&callback);
thread1.join();
thread2.join();
return 1;
}
代码编译并运行正常。两个Matlab引擎实例按预期启动并运行。但不知怎的,我在线程中启动的Matlab引擎自动关闭而没有调用engClose();
。
如果我没有使用callback()
拨打thread
,例如
void main() {callback();}
应用程序以打开的Matlab引擎结束,这是完全可以预期的。但是使用该线程,所有Matlab引擎都会自动关闭。
有没有人遇到过类似的问题?我希望这些实例保持打开,除非我明确指示关闭信号,否则我可能会失去对我的管理类的控制,因为引擎意外关闭。任何想法都表示赞赏。
修改
正如评论所指出的,在这种情况下我不需要shared_ptr
。但事实是,在我的实际实施中,它在某种程度上是必要的。但是,这里的简单示例似乎是不必要的。无论如何,如果你想知道,我确实尝试了
std::thread thread1(callback);
std::thread thread2(callback);
thread1.join();
thread2.join();
结果完全相同。所以在这里使用指针绝对不是问题。