Chapelメモ - 5
書いてるプログラムがいよいよ排他制御が無いとまともに動かなくなつて來たので、ここで排他制御に触れよう。Chapelには排他制御の爲にsync變數とsingle變數がある。どちらも型に附け加へることで宣言する。
var A: sync int; var B: single int;
sync變數
sync變數には論理的にfullとemptyの二状態がある。
read
emptyの時は變數の値を讀まうとするタスクは、次の代入で状態がfullになるまで停止する。代入によってアトミックに状態はfullになる。また、fullの時に變數の値を讀むと、値を讀むと同時にアトミックに状態がemptyに遷移する。複數のタスクが待つてゐれば、そのうち一つが非決定的に選擇されて起床し、他は停止し續ける。
write
fullの時に變數の値を書かうとするタスクは、状態がemptyになるまで待つてから代入する。こちらも複數のタスクが待つてゐれば、そのうち一つが非決定的に選擇される。
まとめ
read | write | |
---|---|---|
empty | 代入されるまで待つ | 即時に代入する |
full | 即時に読み込む | 讀まれるまで待つ |
sync變數は初期値が与えられた場合は初期状態がfullに、そうでなければemptyになる。
var count$: sync int = 0; begin count$ += 1; begin count$ += 1; begin count$ += 1;
こんな感じのコードもきちんと同期が取れる。
single變數
一回しか代入できない變數。代入前のreadは代入されるまで停止する。適當だな。
メソッド
状態\次状態 | empty | full | 不定 |
---|---|---|---|
empty | writeEF(t) | ||
full | readFE() | readFF(), writeFF(t) | |
不定 | writeXF(t) | readXX() |