我通過試錯發現MATLAB引擎函數並不完全是線程安全的。Matlab引擎的線程安全性API
有誰知道規則?
經過反覆試驗發現:
在Windows上,以MATLAB的連接是通過COM,因此COM單元線程規則。所有調用都必須發生在同一個線程中,但只要每個連接都被隔離,多個線程就可以發生多個連接。
從下面的答案看來,在UNIX上這種情況並非如此,只要調用是串行進行的,就可以從多個線程進行調用。
我通過試錯發現MATLAB引擎函數並不完全是線程安全的。Matlab引擎的線程安全性API
有誰知道規則?
經過反覆試驗發現:
在Windows上,以MATLAB的連接是通過COM,因此COM單元線程規則。所有調用都必須發生在同一個線程中,但只要每個連接都被隔離,多個線程就可以發生多個連接。
從下面的答案看來,在UNIX上這種情況並非如此,只要調用是串行進行的,就可以從多個線程進行調用。
當我第一次開始使用引擎時,我沒有運行任何關於線程安全的文檔,所以我認爲它不是線程安全的。
我使用C++類來同步對引擎實例的訪問。對於更多的並行處理設計,我實例化引擎類的多個實例。
(編輯)我在Solaris上使用MATLAB R14。我使用'engOpen'調用打開引擎,並使用'engClose'關閉它。當Close由不同於稱爲Open的線程調用的線程調用時,我的平臺不會崩潰。
從用戶的角度來看,Matlab的解釋器純粹是單線程的。爲了安全起見,您可能需要從單個線程訪問引擎。
請注意,Matlab內部使用大量線程。有GUI線程,在最後幾個版本中,解釋器可以在幕後使用多個線程。但是,解釋器在語義上等價於單線程解釋器(帶有中斷)。
您可以使用engOpenSingleUse
而不是使用engOpen
來使多個線程分開工作。 (僅Windows)
MATLAB libraries are not thread-safe. If you create multithreaded applications, make sure only one thread accesses the engine application.
AFAIK MATLAB引擎是在Windows上使用COM實現的,在Unix上使用管道:http://www.mathworks.com/help/matlab/matlab_external/使用-MATLAB的engine.html – Amro 2013-05-21 23:23:36