This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Synchronizing Access to an Object | ||
|---|---|---|
| Code | Expected | Actual |
require 'thread'
class Object
def synchronize
mutex.synchronize { yield self }
end
def mutex
@mutex ||= Mutex.new
end
end
list = []
Thread.new { list.synchronize { |l| sleep(5); 3.times { l.push "Thread 1" } } }
Thread.new { list.synchronize { |l| 3.times { l.push "Thread 2" } } }
sleep(6)
list |
["Thread 1", "Thread 1", "Thread 1", "Thread 2", "Thread 2", "Thread 2"] | ["Thread 1", "Thread 1", "Thread 1", "Thread 2", "Thread 2", "Thread 2"] |
list = []
Thread.new { list.synchronize { |l| sleep(5); 3.times { l.push "Thread 1" } } }
Thread.new { 3.times { list.push "Thread 2" } }
sleep(6)
list |
["Thread 2", "Thread 2", "Thread 2", "Thread 1", "Thread 1", "Thread 1"] | ["Thread 2", "Thread 2", "Thread 2", "Thread 1", "Thread 1", "Thread 1"] |
require 'aspectr'
require 'thread'
class Synchronized < AspectR::Aspect
def lock(method_sym, object, return_value, *args)
object.mutex.lock
end
def unlock(method_sym, object, return_value, *args)
object.mutex.unlock
end
end
array = %w{do re mi fa so la ti}
Synchronized.new.wrap(array, :lock, :unlock, :push, :pop, :each)
Thread.new { array.each { |x| puts x } }
Thread.new do
puts 'Destroying the array.'
array.pop until array.empty?
puts 'Destroyed!'
end |
do re mi fa so la ti Destroying the array. Destroyed! |
class_eval ' def push(*args,&block) return (__aop__-605355376_1687822(*args,&block)) unless Aspect.dispatch? begin exit_status = nil self.class.__aop_call_advice(:PRE, 'push', self, exit_status,*args,&block) exit_status = [] return (exit_status.push(__aop__-605355376_1687822(*args,&block)).last) rescue Exception exit_status = true raise ensure self.class.__aop_call_advice(:POST, 'push', self, exit_status,*args,&block) end end ' class_eval ' def pop(&block) return (__aop__-605355376_1689870(&block)) unless Aspect.dispatch? begin exit_status = nil self.class.__aop_call_advice(:PRE, 'pop', self, exit_status,&block) exit_status = [] return (exit_status.push(__aop__-605355376_1689870(&block)).last) rescue Exception exit_status = true raise ensure self.class.__aop_call_advice(:POST, 'pop', self, exit_status,&block) end end ' class_eval ' def each(&block) return (__aop__-605355376_983310(&block)) unless Aspect.dispatch? begin exit_status = nil self.class.__aop_call_advice(:PRE, 'each', self, exit_status,&block) exit_status = [] return (exit_status.push(__aop__-605355376_983310(&block)).last) rescue Exception exit_status = true raise ensure self.class.__aop_call_advice(:POST, 'each', self, exit_status,&block) end end ' do re mi fa so la ti Destroying the array. Destroyed! |