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から抜けだします。
実行中ではmain、proc1、proc2、proc3というプロセスがそ
れぞれ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を使用することが推奨されま
す。