All pastes #770070 Raw Edit

Stuff

public text v1 · immutable
·published 2007-11-11 21:51 UTC
rendered paste body
#!/usr/bin/ruby

require 'monitor'

class ObjectWrapper
    def initialize(wrapped_object)
        @wrapped_object = wrapped_object
    end
    :private
    def method_missing(id, *args, &block)
        wrap(id, *args, &block)
    end
    def wrap_real(id, *args, &block)
        if block.nil?
            return @wrapped_object.__send__(id, *args)
        else
            return @wrapped_object.__send__(id, *args) { |*args2| block.call(*args2) }
        end
    end
    :public
    def wrap(id, *args, &block)
        wrap_real(id, *args, &block)
    end
end

class Synchronizator < ObjectWrapper
    def initialize(wrapped_object)
        super
        @wrapped_object.extend(MonitorMixin)
    end
    def wrap(id, *args, &block)
        @wrapped_object.synchronize {
            wrap_real(id, *args, &block)
        }
    end
end


Thread.abort_on_exception = true

def thr(list, number)
    list.each { |i|
        puts "#{number}: #{i}"
        sleep 0.02
    }
end
    

list = [ 0, 1, 2, 3 ]

puts "without synchronizator:"

for i in 1..3
    Thread.new { thr(list, i) }
end

sleep 1


puts "\nwith synchronizator:"

l_ = Synchronizator.new(list)

for i in 1..3
    Thread.new { thr(l_, i) }
end

sleep 1