线程在C ++中结束后,Matlab引擎意外关闭

时间:2017-04-23 01:05:48

标签: c++ multithreading matlab

已更新

(因为我的原始条件在经过多次测试后不再合适,我更改了代码示例以更好地描述问题)

长话短说,在我的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();

结果完全相同。所以在这里使用指针绝对不是问题。

0 个答案:

没有答案