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."
答案 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)
之后发生。