提供: tty00
目次
プロセス
イニシャルプロセスの定義
initはイニシャルプロセスを定義する。
init { printf("init\n"); }
プロセスの定義
プロセスの定義はproctypeを使用する。
proctype P1(){ printf("hello"); } proctype P2(int x){ printf("x=%d\n"); }
プロセスの実行
定義されたプロセスの実行にはrunを使用する。
init { run P1(); run P2(100); } proctype P1(){ printf("hello\n"); } proctype P2(int x){ printf("x=%d\n",x); }
プロセスの定義にactiveを付けると、イニシャル時にプロセスの実行を始める。 Nを指定すると複数のプロセスを実行する。
active proctype P(){ printf("hello pid=%d",_pid); } #define N 5 active [N] proctype Pn(){ printf("hello pid=%d",_pid); }
条件文と制御文
繰り返し
proctype P(){ do :: printf("A\n"); :: printf("B\n"); :: printf("C\n"); od; }
条件文
proctype P(){ int n = 10; if :: (n < 5) -> printf("A\n"); :: (n == 10) -> printf("B\n"); :: else -> printf("C\n"); fi }
goto文
proctype P(){ goto label; printf("A"); label: printf("B"); }
通信チャンネル
同期通信
chan ch = [0] of {int,int};
非同期通信
chan ch = [1] of {int,int};
データの送信と受信
- データの送信
- "!!"を使用するとチャンネルにメッセージがソートされ格納される。
ch ! 100,200; ch !! 100,200;
- データの受信
- チャンネルの先頭からメッセージを取り出す(FIFO)
int x,y; ch ? x,y;
- 条件を指定してにメッセージを取り出す
- 値を指定すると、値が一致したメッセージを取り出す。
chan ch = [5] of {int,int}; ch ?? x,100;
メッセージのコピー
"< >"で囲むと、メッセージと取り除かずにコピーしてメッセージを取り出す。
ch ? <x,y>; ch ?? <x,y>;
メッセージのポーリング
"[ ]"で囲むと、変数の値は変わらない。
ch ? [x,y]; ch ?? [x,y];
値を指定して条件を指定する。
if ::ch ? [x,100] -> ch ? x,100; /*何か処理を行う*/ fi
関数
- full
- empty
- nfull
- nempty
- len
チャンネルが一杯かチャンネルの状態を確認する
if ::(full(ch)) -> skip; fi
Note
- 条件文ではelseを使用しない。empty/nemptyとfull/nfullを対になるようにする。
- _pidを値に変換するにはeval(_pid)とする。