読者です 読者をやめる 読者になる 読者になる

同期通信プリミティブを作った

微妙に純粋な興味以外の必要性もあって、CSP(Communicating Sequential Processes)をこの本

で勉強していたのですが、ふと Ruby で実装してみたくなりました。
CSP における並行処理のプリミティブはイベントによる同期なのですが、Ruby の SizedQueue はサイズを 0 にして同期通信用に使う、ということができません。いくつか代用する方法はある(サイズ1にして、常に2個オブジェクトを出し入れする、双方向にキューを用意する、等)のですが、あまりスマートではありません。
検索してみたところ、いくつか CSP をうたったライブラリがあり、またバリア同期を実装したものもあったのですが(こちら http://qiita.com/genta/items/059e57923368fc706802 )、自分で 1 対 1 通信(write-read)のライブラリを実装してみました。
こちら → https://github.com/metanest/non_buffer
書き込み側、読み出し側の、どちらか先に実行されたほうがブロックされます。もう片方を実行する時点でブロックは外れます。多重に書き込み/読み出ししようとすると、待ちになるのではなく例外になります。
参考書の第1章にあるサンプルを Ruby で書いたものはこんな感じになります https://github.com/metanest/non_buffer/blob/master/sample2.rb