2008-10-29 38 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.