2012-12-30 9 views

Odpowiedz

14

Niemożliwe. Po prostu zapisz wywołanie metody mutex.

Utwórz nowe Mutex wewnątrz klasy, dzięki czemu można używać tego samego obiektu mutex:

class Foo 
    attr_reader :my_val 

    def initialize 
    @my_mutex = Mutex.new 
    @my_val = 0 
    end 

    def bar 
    @my_mutex.synchronize do 
     # do something you want to be synchronized here, e.g.: 
     @my_val = @my_val + 1 
    end 
    end 

    def another_bar 
    @my_mutex.synchronize do 
     # do something you want to be synchronized here 
     @my_val = @my_val - 1 
    end 
    end 
end 

foo = Foo.new 
threads = [] 
threads << Thread.new { 50.times { foo.bar }} 
threads << Thread.new { 50.times { foo.another_bar }} 
threads.map { |t| t.join } # wait for all threads to finish 
puts foo.my_val # should print 0 

Zobacz http://apidock.com/ruby/Mutex

Można też może zrobić METAPROGRAMOWANIE magii, aby chronić tylko swoje metody .. owijania metody dla ciebie, np tworzenie nowej zmodyfikowanej metody "bar" i "another_bar" z tym blokiem synchronizującym w środku.

+0

Co z tym http://stackoverflow.com/questions/3208462/does-ruby-have-the-java-equivalent-ofsynchronize-keyword? –

+11

Pierwszy przykład kodu jest dobry, ale 'Mutex.new.synchronize' jest bezużyteczny. Ponieważ nie zachowujesz odniesienia do nowo utworzonego Mutexa, żaden inny wątek nigdy nie może go zablokować, więc nigdy nie wykluczy żadnego wątku z krytycznego regionu (który jest całym punktem muteksów). –

+0

Nie jestem pewien, czy to prawda, ale co powiedział @AlexD ma sens! –