All pastes #770071 Raw Edit

Unnamed

public ruby v1 · immutable
·published 2007-11-11 21:51 UTC
rendered paste body
#!/usr/bin/rubyrequire '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)    endendclass 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)        }    endendThread.abort_on_exception = truedef 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) }endsleep 1puts "\nwith synchronizator:"l_ = Synchronizator.new(list)for i in 1..3    Thread.new { thr(l_, i) }endsleep 1