Hi,
Currently, I am only retrieving data with my DRb client, but this will
change in the near future. If I am updating the data class via the DRb
client, I assume I will need to take precautions to protect the data class?
If you use a mutex in this situation, whom gets blocked by the mutex and how
does it effect the DRb operation/client?
Yes, you need it and work well.
count.rb
require ‘thread’
class Counter
def initialize(n = 0)
@value = n
end
attr_reader :value
alias :to_i :value
def succ
it = @value
sleep 0.5
@value = it + 1
puts @value
return @value
end
end
class MutexCounter < Counter
def initialize(n = 0)
super(n)
@mutex = Mutex.new
end
def succ
@mutex.synchronize do
return super
end
end
end
if FILE == $0
require ‘drb/drb’
class Counter
include DRbUndumped
end
here = ARGV.shift || ‘druby://localhost:12345’
front = Hash.new
front[:Counter] = Counter.new
front[:MutexCounter] = MutexCounter.new
DRb.start_service(here, front)
puts DRb.uri
DRb.thread.join
end
test_count.rb
require ‘drb/drb’
def test(counter, n = 10)
n.times do |i|
puts “#{i}: #{counter.succ}”
end
end
there = ARGV.shift || ‘druby://localhost:12345’
DRb.start_service
front = DRbObject.new(nil, there)
puts “Counter”
test(front[:Counter])
puts “MutexCounter”
test(front[:MutexCounter])
···
run scripts.
Terminal 1
% ruby count.rb
Terminal 2 and 3
% ruby test_countr.b
Terminal 2 Terminal 3
Counter Counter
0: 1 0: 2
1: 2 1: 3
2: 3 2: 4
3: 4 3: 5
4: 5 4: 6
5: 6 5: 7
6: 7 6: 8
7: 8 7: 9
8: 9 8: 10
9: 10 9: 11
MutexCounter MutexCounter
0: 1 0: 2
1: 3 1: 4
2: 5 2: 6
3: 7 3: 8
4: 9 4: 10
5: 11 5: 12
6: 13 6: 14
7: 15 7: 16
8: 17 8: 18
9: 19 9: 20