複数のS-function builder blockは同一プロセスで動く?

3 ビュー (過去 30 日間)
tnksral
tnksral 2017 年 6 月 1 日
コメント済み: Akihiro Yasuda 2017 年 6 月 9 日
下記質問の回答を見ると、
複数のS-Functionを生成した場合、各S- Functionはそれぞれのダイナミックリンクライブラリとして作成されます。各MEX-ファイルは別プロセスとなるため、MATLABの機能では別プロセス間の変数を共有することはできません。共有するためには、OSの機能である共有メモリ(Windowsではメモリマップドファイル)を使用することになります。
と、「異なるS-functionは別プロセスで動く」ことが明記されています。 しかし、S-functionから呼び出すCコード内で、 unistd.hのgetpid()を呼び出してみたところ、 複数のS-functionが同一のプロセスIDを返しました。 (linuxでもWindowsでも同じでした)
これはS-function blockは同一プロセスで動くことを示しているのでしょうか。 異なるプロセスで動くことを示すにはどのようにしたらよいのでしょうか。

採用された回答

Akihiro Yasuda
Akihiro Yasuda 2017 年 6 月 5 日
編集済み: Akihiro Yasuda 2017 年 6 月 5 日
「異なるS-functionは別プロセスで動く」≠「同一のプロセスID」です。
getpid()を実行した際に取得されるプロセスIDはMATLAB.exeになります。
MATLAB.exe上で実行される異なるmexファイルは、それぞれ独立したダイナミックリンクライブラリであるため、変数の共有をサポートしていません。そのため、共有メモリ(Windowsではメモリマップドファイル)が代替案として提案されています。
その他には、共有させたい変数を引数としたラッパー関数を用意し、S-functionブロック間で結線させる方法が考えられます。
  4 件のコメント
tnksral
tnksral 2017 年 6 月 6 日
S-functionで呼び出す外部ライブラリは同じものですが、
S-function名をS-functionごとに異なるものに設定しているので、S-functionから呼び出すMEX-ファイルは、S-functionごとに別々に生成されています。
そして生成された異なるMEX-ファイルを異なるS-functionから呼び出しているため、回答で指摘いただいたような条件ではないように思えます。
以上を踏まえると、 異なるMEX-ファイルを用いていても、 その中で同じ名前のグローバル変数を用いてた場合には、グローバル変数が共有されるという認識で合っておりますでしょうか。
Akihiro Yasuda
Akihiro Yasuda 2017 年 6 月 9 日
同じダイナミックリンクライブラリを外部参照している別名のMEX-ファイルがあり、そのダイナミックリンクライブラリ内で同名のグローバル変数を用いた場合、そのグローバル変数はMEX-ファイルの外部で保持されているため、MEX-ファイル間でグローバル変数が共有されます。

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!