私の occam-pi アプリケーションには、次のように定義された実行時間の長いプロデューサープロセスがあります。
PROC producer (VAL INT start, step, CHAN OF INT c!)
INT count:
SEQ
count := start
WHILE TRUE
SEQ
c ! count
count := count + step
:
c
から増加するチャンネルの値を送信しstart
ますstep
。完全な例はこちらから入手できます。
これはうまく機能し、無限ループはCSP では慣用的であると信じるようになりました。問題は、消費アルゴリズムが終了したときに発生します。この例では、コンシューマが終了するとデッドロックが発生します。
ここで説明するTAGGED.INT
プロトコルは、プロセスのネットワークをシャットダウンする問題を解決しようとしますが、私の現在の理解では、主な仕事がチャネルで送信しているプロデューサーを終了する簡単な方法はありません。プロデューサーを停止させる唯一の方法は、ある種のコントロール チャネルと出力のブラック ホールを使用することだと思われます。
PROTOCOL CONTROL
CASE
poison
:
PROTOCOL TAGGED.INT
CASE
normal; INT
poison
:
PROC producer (VAL INT start, step, CHAN OF TAGGED.INT c!, CHAN OF CONTROL control?)
INT count:
INITIAL BOOL running IS TRUE:
SEQ
count := start
WHILE running
SEQ
PRI ALT
control ? poison
SEQ
running := FALSE
c ! poison -- necessary, only to kill the black hole process
SKIP
SEQ
c ! normal; count
count := count + step
:
完全な動作例はこちらから入手できます。これの問題は、コードがはるかに読みにくいことです-主観的であることは知っていますが、ソフトウェアエンジニアリングにとって重要です-元の意図は元の意図に比べて複雑です。オッカムの剃刀とは相反するようだ!
JCSP 、C++CSP2、およびpython-cspを使用すると、プロセスのネットワークをシャットダウンするためにチャネルを明示的にポイズニングできます。何らかの理由で、これを行うために occam を論争させると、コードがシャットダウン ロジックで汚染され、非論理的に見えます。
問題は、例のcontrol
ように明示的なチャネルを使用せずにプロデューサー プロセスを終了する方法があるかどうかです。
編集:
このメーリング リスト アーカイブ ( Poison ) には、このトピックに関するより多くの情報が含まれている可能性があります。これはかなり古いものです (> 10 年)。それ以来、何か変わったことはありますか、それともこれがoccam-piで「プロセスの終了」を達成するための最良の方法ですか?