'Mutex#synchronize`的用途与`ConditionVariable#signal`一起使用

时间:2013-11-27 13:47:45

标签: ruby

railscard对this question的回答以及ConditionVariable的{​​{3}}建议代码类似于以下内容:

m = Mutex.new
cv = ConditionVariable.new 

Thread.new do
  sleep(3)  # A
  m.synchronize{cv.signal}
end

m.synchronize{cv.wait(m)}
puts "Resource released."  # B

此代码将流程注释为B,等待A完成。

我理解m.synchronize{...}围绕cv.wait(m)的目的。围绕m.synchronize{...} cv.signal的目的是什么?如果我有以下内容会有什么不同呢?

m = Mutex.new
cv = ConditionVariable.new 

Thread.new do
  sleep(3)
  cv.signal
end

m.synchronize{cv.wait(m)}
puts "Resource released."

2 个答案:

答案 0 :(得分:1)

我认为在这个例子中它没用,但是在发出信号之前你有任何条件或计算以避免竞争条件时它是必需的。

答案 1 :(得分:0)

为了解锁cv中的cv.wait(m),必须在cv.signal之后发出cv.wait。在这种特殊情况下,由于sleep(3),该时间很可能得到保证,但除此之外,cv.signal之前存在cv.wait(m)发出的危险。如果发生这种情况,signal后将不会发出任何cv.wait(m)cv的锁定状态将永久持续。 m.synchronize{...}周围cv.signal的目的是确保它在cv.wait(m)之后发生。