Documentaion: Pauseable Statements

plangではほとんどのstatementがpauseableとなっています。つまり、あるprocessを指定してその処理を中断し、再開す るようなことがpauseableなstatementで行うことが可能です。

Inline functions vs. Functions
native function、functionを除く全てのstatementはpauseableです。また、class methodはfunctionと同様の扱いとなるのでpauseableでありません。


このコードはsemaphoreを利用したprocess管理のサンプルプログラムです。
bool P(string, unsigned int&)は、mutexが0より大きい場合のみプロセ スの処理を進ませることを許可します。
一方、inline P(string,unsigned int&)で!P(p,mutex)を評価 し、function Pがtrueを返した場合のみwhileから抜けだします。

実行中ではmainproc1proc2proc3というプロセスがそ れぞれreadを行います。mutexは2で初期化されたため、2つのプロセスがread中でcritical sectionへアクセスすることが許可されています。
readで呼ばれたinline Pはpauseableなstatementであり、while loopが続く場合、そのプロセスは一時中断され、次のプロセスが再開されます。
このように、inline functionは他のプロセスによって中断される処理を記述することが可能です。

一方、function Pではmutexの値を操作しています。このような処理の場合、複数のプロセスが同時に内部へ侵入する ことは推奨されません。例えば、mutexの値が1でありif(mutex)内へ侵入したproc1が中断され、再開した proc2がif(mutex)を評価した場合mutexの値は依然として1であり、結果として二つのプロセスで減算されたmutexは 予期されない値となります
このように、一連の処理が他のプロセスによって中断されることが望まれない場合、pauseableでないfunctionを使用することが推奨されま す。