Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 与“条件变量”信号一起使用的“互斥体”同步的目的`_Ruby - Fatal编程技术网

Ruby 与“条件变量”信号一起使用的“互斥体”同步的目的`

Ruby 与“条件变量”信号一起使用的“互斥体”同步的目的`,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.

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{…}
around
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."

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

为了在
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)
之后