Ruby 与“条件变量”信号一起使用的“互斥体”同步的目的`
railscard的答案和forRuby 与“条件变量”信号一起使用的“互斥体”同步的目的`,ruby,Ruby,railscard的答案和for条件变量建议的代码与以下类似: 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{…}aroundcv.wait(m)。m.
条件变量
建议的代码与以下类似:
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{…}
aroundcv.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."
我认为在这个例子中它是没有用的,但是在发信号之前,当你有任何条件或计算时,它是必需的,以避免竞争条件。为了在
cv.wait(m)
中解锁cv.signal
,必须在cv.wait
之后发出cv.signal
。在这种特殊情况下,由于sleep(3)
,该定时最有可能得到保证,但否则,在cv.wait(m)
之前有发出cv.signal
的危险。如果发生这种情况,则在cv.wait(m)
之后将不会发出任何信号,并且cv
的锁定状态将永远持续。m.synchronize{…}
环绕cv.signal
的目的是确保它发生在cv.wait(m)
之后