MatlabエンジンAPIのスレッドセーフ
-
05-07-2019 - |
質問
試行錯誤を通して、MATLABエンジン関数が完全にスレッドセーフではないことを発見しました。
誰もがルールを知っていますか?
試行錯誤で発見:
Windowsでは、MATLABへの接続はCOM経由であるため、COMアパートメントスレッドルールが適用されます。すべての呼び出しは同じスレッドで発生する必要がありますが、各接続が分離されている限り、複数のスレッドで複数の接続が発生する可能性があります。
以下の回答から、これはUNIXでは当てはまらないようです。UNIXでは、呼び出しが連続して行われる限り、複数のスレッドから呼び出しを行うことができます。
解決
最初にエンジンの使用を開始したとき、スレッドセーフに関するドキュメントに出くわしたことはなかったため、スレッドセーフではないと想定しました。
C ++クラスを使用して、エンジンインスタンスへのアクセスを同期します。より並列処理の設計では、エンジンクラスの複数のインスタンスをインスタンス化します。
(編集)SolarisでMATLAB R14を使用しています。 「engOpen」コールを使用してエンジンを開き、「engClose」を使用してエンジンを閉じます。 Openを呼び出したスレッドとは異なるスレッドからCloseが呼び出されても、プラットフォームはクラッシュしません。
他のヒント
ドキュメントから
MATLABライブラリはスレッドセーフではありません。 マルチスレッドを作成する場合 アプリケーション、1つだけを確認してください スレッドはエンジンにアクセスします アプリケーション。
ユーザーの観点からすると、Matlabのインタープリターは純粋にシングルスレッドです。安全のために、おそらく単一のスレッドからエンジンにすべてアクセスする必要があります。
内部では、Matlabは多くのスレッドを使用します。 GUIスレッドがあり、最後のいくつかのバージョンでは、インタープリターは舞台裏で複数のスレッドを使用できます。ただし、インタープリターは、意味的にはシングルスレッドインタープリター(割り込みあり)と同等です。
engOpen
を使用する代わりに engOpenSingleUse
を使用して、複数のスレッドを個別に動作させることができます。 (Windowsのみ)