我通过反复试验发现 MATLAB 引擎函数不是完全线程安全的。
有人知道规则吗?
通过反复试验发现:
在 Windows 上,与 MATLAB 的连接是通过 COM 进行的,因此适用 COM Apartment 线程规则。所有调用都必须发生在同一个线程中,但是多个连接可以发生在多个线程中,只要每个连接都是隔离的。
从下面的答案来看,在 UNIX 上似乎不是这种情况,只要调用是串行进行的,就可以从多个线程进行调用。
我通过反复试验发现 MATLAB 引擎函数不是完全线程安全的。
有人知道规则吗?
通过反复试验发现:
在 Windows 上,与 MATLAB 的连接是通过 COM 进行的,因此适用 COM Apartment 线程规则。所有调用都必须发生在同一个线程中,但是多个连接可以发生在多个线程中,只要每个连接都是隔离的。
从下面的答案来看,在 UNIX 上似乎不是这种情况,只要调用是串行进行的,就可以从多个线程进行调用。
从文档中,
MATLAB 库不是线程安全的。如果您创建多线程应用程序,请确保只有一个线程访问引擎应用程序。
当我第一次开始使用引擎时,我没有遇到任何关于线程安全的文档,所以我认为它不是线程安全的。
我使用 C++ 类来同步对引擎实例的访问。对于更多并行处理设计,我实例化了引擎类的多个实例。
(编辑)我在 Solaris 上使用 MATLAB R14。我使用“engOpen”调用打开引擎,并使用“engClose”关闭它。当调用关闭的线程与调用打开的线程不同时,我的平台不会崩溃。
从用户的角度来看,Matlab 的解释器是纯单线程的。为了安全起见,您可能需要从单个线程对引擎进行所有访问。
请注意,在内部,Matlab 使用了大量线程。有 GUI 线程,在最近的几个版本中,解释器可以在幕后使用多个线程。但是,解释器在语义上等同于单线程解释器(带有中断)。
您可以使用engOpenSingleUse
而不是使用engOpen
来使多个线程单独工作。(仅限 Windows)