2008-10-29 70 views
8

我通过试错发现MATLAB引擎函数并不完全是线程安全的。Matlab引擎的线程安全性API

有谁知道规则?

经过反复试验发现:

在Windows上,以MATLAB的连接是通过COM,因此COM单元线程规则。所有调用都必须发生在同一个线程中,但只要每个连接都被隔离,多个线程就可以发生多个连接。

从下面的答案看来,在UNIX上这种情况并非如此,只要调用是串行进行的,就可以从多个线程进行调用。

+0

AFAIK MATLAB引擎是在Windows上使用COM实现的,在Unix上使用管道:http://www.mathworks.com/help/matlab/matlab_external/使用-MATLAB的engine.html – Amro 2013-05-21 23:23:36

回答

3

当我第一次开始使用引擎时,我没有运行任何关于线程安全的文档,所以我认为它不是线程安全的。

我使用C++类来同步对引擎实例的访问。对于更多的并行处理设计,我实例化引擎类的多个实例。

(编辑)我在Solaris上使用MATLAB R14。我使用'engOpen'调用打开引擎,并使用'engClose'关闭它。当Close由不同于称为Open的线程调用的线程调用时,我的平台不会崩溃。

1

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

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

1

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

6

documentation

MATLAB libraries are not thread-safe. If you create multithreaded applications, make sure only one thread accesses the engine application.