8

試行錯誤の結果、MATLABエンジン関数は完全にスレッドセーフではないことがわかりました。

誰かがルールを知っていますか?

試行錯誤で発見:

Windowsでは、MATLABへの接続はCOMを介して行われるため、COMApartmentのスレッドルールが適用されます。すべての呼び出しは同じスレッドで発生する必要がありますが、各接続が分離されている限り、複数の接続が複数のスレッドで発生する可能性があります。

以下の回答から、これはUNIXには当てはまらないようです。UNIXでは、呼び出しが連続して行われる限り、複数のスレッドから呼び出しを行うことができます。

4

4 に答える 4

7

ドキュメントから、

MATLAB ライブラリはスレッドセーフではありません。マルチスレッド アプリケーションを作成する場合は、1 つのスレッドのみがエンジン アプリケーションにアクセスするようにしてください。

于 2010-06-16T13:46:40.923 に答える
3

このエンジンを初めて使用したとき、スレッド セーフに関するドキュメントを見つけられなかったので、スレッド セーフではないと思い込んでいました。

C++ クラスを使用して、エンジン インスタンスへのアクセスを同期します。より並列処理を設計するために、エンジン クラスの複数のインスタンスをインスタンス化します。

(編集) Solaris で MATLAB R14 を使用しています。「engOpen」呼び出しを使用してエンジンを開き、「engClose」を使用してエンジンを閉じます。Open を呼び出したスレッドとは別のスレッドによって Close が呼び出されても、プラットフォームはクラッシュしません。

于 2008-10-30T20:25:11.020 に答える
2

ユーザーの観点から見ると、Matlab のインタープリターは純粋にシングルスレッドです。安全のために、おそらくエンジンへのすべてのアクセスを単一のスレッドから行う必要があります。

内部では、Matlab は多くのスレッドを使用することに注意してください。GUI スレッドがあり、最近のいくつかのバージョンでは、インタープリターはバックグラウンドで複数のスレッドを使用できます。ただし、インタープリターは意味的にはシングルスレッド インタープリター (割り込みあり) と同等です。

于 2008-10-29T23:13:33.630 に答える
0

engOpenSingleUseの代わりに を使用engOpenして、複数のスレッドを別々に動作させることができます。(Windowsのみ)

于 2009-11-11T16:43:18.420 に答える