Thread and Mutex in Ruby 1.8.7

Hello, in ruby 1.8.7

I want to do something like this:

require 'thread'
class Bar
   def initialize(f)
     @f=f
   end

   def m_a #This method isn't call only by FOO::m_b
      @f.m_a
   end
end

class Foo
def initialize
@mutex=Mutex.new
end

def m_a
@mutex.synchronize do
puts "A"
end
end

def m_b
@mutex.synchronize do
puts "B"
     b=Bar.new(self)
     b.m_a
end
end
end

f=Foo.new
f.m_b

I must have

A
B

but I have
B
test.rb:8:in `synchronize': stopping only thread (ThreadError)
note: use sleep to stop forever
from test.rb:8:in `m_a'
from test.rb:16:in `m_b'
from test.rb:14:in `synchronize'
from test.rb:14:in `m_b'
from test.rb:22

because I can't do

mutex=Mutex.new
mutex.synchronize do
   mutex.synchronize do
     puts "A"
     puts "B"
   end
end

Nevertheless my thread have a lock on the mutex. How to reuse it ?

Thanks

···

--
Posted via http://www.ruby-forum.com/\.

mutex=Mutex.new
mutex.synchronize do
  mutex.synchronize do
    puts "A"
    puts "B"
  end
end

Mutex is not reentrant.

m=Mutex.new
m.synchronize do
puts "foo"
m.synchronize do
  puts "bar"
end
end

foo
ThreadError: thread 0x341ac tried to join itself
         from (irb):4:in `synchronize'
         from (irb):4
         from (irb):2:in `synchronize'
         from (irb):2

Nevertheless my thread have a lock on the mutex. How to reuse it ?

Use Monitor instead of Mutex.

m=Monitor.new
m.synchronize do
  puts "foo"
  m.synchronize do
   puts "reentrant"
  end
end

foo
reentrant

hth. Sandor Szücs

···

On 05.05.2009, at 14:35, Guillaume Gdo wrote:
--

And then there is also MonitorMixin which adds monitor functionality to every class or instance.

Kind regards

  robert

···

On 09.05.2009 14:32, Sandor Szücs wrote:

On 05.05.2009, at 14:35, Guillaume Gdo wrote:

mutex=Mutex.new
mutex.synchronize do
  mutex.synchronize do
    puts "A"
    puts "B"
  end
end

Mutex is not reentrant.

> m=Mutex.new
> m.synchronize do
> puts "foo"
> m.synchronize do
> puts "bar"
> end
> end
foo
ThreadError: thread 0x341ac tried to join itself
         from (irb):4:in `synchronize'
         from (irb):4
         from (irb):2:in `synchronize'
         from (irb):2

Nevertheless my thread have a lock on the mutex. How to reuse it ?

Use Monitor instead of Mutex.

> m=Monitor.new
> m.synchronize do
> puts "foo"
> m.synchronize do
> puts "reentrant"
> end
> end
foo
reentrant

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/