2013-01-17 31 views
1

我想了解为什么调用Mutex#synchronize会阻止我的代码运行。当我调用同步时,互斥锁没有锁定,所以不应该在代码块中运行无阻碍?第二个线程,没有锁,运行畅通无阻。互斥锁同步为何阻止执行?

m  = Mutex.new 
count1 = count2 = 0 

Thread.new do 
    loop do 
    m.syncronize do 
     count1 += 1 
    end 
    end 
end 
Thread.new do 
    loop do 
    count2 += 1 
    end 
end 
sleep 1 
p count1 # => 0 
p count2 # => 1645454 

注意:我添加了第二个非锁定线程来阐明我的示例。它似乎没有改变行为。

我正在运行MRI 1.9.3-p362。

回答

3

你有一个错字。它是synchronize,而不是syncronize。所以这个线程被中止,并没有计算任何东西。

这里是我用错字输出固定:

m  = Mutex.new 
count1 = count2 = 0 

Thread.new do 
    loop do 
    m.synchronize do 
     count1 += 1 
    end 
    end 
end 
Thread.new do 
    loop do 
    count2 += 1 
    end 
end 
sleep 1 
p count1 # => 1987049 
p count2 # => 19060675 
+0

如果我叫#join,我会抓住这一点。我很高兴我不需要重新思考我对线程的理解! –