バリア同期

復習。
barrier.rb

class Barrier
  def initialize(ts, n, name=nil)
    @ts = ts
    @name = name || self
    @ts.write([key,n])
  end
  def key
    @name
  end
  def sync
    tmp, val = @ts.take([key,nil])
    @ts.write([key, val - 1])
    @ts.read([key, 0])
  end
end

TupleSpaceをつくるほう、5個で待ち合わせる。

require 'barrier.rb'
require 'rinda/tuplespace'
$ts = Rinda::TupleSpace.new
$barrier = Barrier.new( $ts, 5, "test_barrier")
DRb.start_service('druby://localhost:12345', $barrier )
DRb.thread.join

お仕事して待ち合わせるほう

require 'drb/drb'
require 'barrier'
DRb.start_service
$ts = DRbObject.new_with_uri('druby://localhost:12345')
$ts.sync

このスクリプトの5個目が実行されると、それまでの4つもふくめて解放されるのね。