Matlab引擎API的线程安全性

8
我通过试错发现MATLAB引擎函数并非完全线程安全。是否有人知道规则?
试错发现:
在Windows中,与MATLAB的连接是通过COM完成的,因此适用COM公寓线程规则。所有调用必须在同一线程中进行,但多个连接可以在多个线程中进行,只要每个连接都是隔离的。
从下面的答案中,似乎在UNIX上并非如此,只要按顺序进行调用,就可以从多个线程中进行调用。

据我所知,MATLAB引擎在Windows上使用COM实现,在Unix上使用管道:http://www.mathworks.com/help/matlab/matlab_external/using-matlab-engine.html - Amro
4个回答

7

根据文档,MATLAB库不支持多线程。如果您创建了多线程应用程序,请确保只有一个线程访问引擎应用程序。


3
当我最初开始使用引擎时,我没有找到任何有关线程安全的文档,因此我认为它不是线程安全的。
我使用一个C++类来同步访问引擎实例。对于更多的并行处理设计,我实例化了多个引擎类的实例。
(编辑)我在Solaris上使用MATLAB R14。我使用'engOpen'调用打开引擎,并使用'engClose'关闭引擎。当Close被不同的线程调用时,我的平台不会崩溃。

你的应用程序在Solaris上访问引擎的不同线程时不会崩溃。但在Windows上,由于COM对象的限制,它会崩溃。 - TonySalimi

2

从用户的角度来看,Matlab的解释器是纯单线程的。为了安全起见,您可能需要从单个线程中进行对引擎的所有访问。

请注意,在内部,Matlab使用大量的线程。有GUI线程,在最近的几个版本中,解释器可以在幕后使用多个线程。但是,解释器在语义上等同于单线程解释器(带有中断)。


0

您可以使用engOpenSingleUse而不是使用engOpen来使多个线程分别工作。(仅适用于Windows)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接