Thread and Mutex in Ruby 1.8.7

G

Guillaume Gdo

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

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
 
S

Sandor Szücs

mutex=3DMutex.new
mutex.synchronize do
mutex.synchronize do
puts "A"
puts "B"
end
end

Mutex is not reentrant.

irb> m=3DMutex.new
irb> m.synchronize do
irb> puts "foo"
irb> m.synchronize do
irb> puts "bar"
irb> end
irb> 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.

irb> m=3DMonitor.new
irb> m.synchronize do
irb> puts "foo"
irb> m.synchronize do
irb> puts "reentrant"
irb> end
irb> end
foo
reentrant


hth. Sandor Sz=FCcs
--
 
R

Robert Klemme

Mutex is not reentrant.

irb> m=Mutex.new
irb> m.synchronize do
irb> puts "foo"
irb> m.synchronize do
irb> puts "bar"
irb> end
irb> 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




Use Monitor instead of Mutex.

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

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

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,962
Messages
2,570,134
Members
46,690
Latest member
MacGyver

Latest Threads

Top