1
我需要一个线程来停止自己,然后被另一个线程唤醒。我遇到的问题是我找不到一个完全万无一失的好解决方案。我的代码现在看起来是这样的:安全地唤醒Ruby中的线程
def initialize
@data_lock = Mutex.new
@closed = false
end
def get_response
@data_lock.synchronize do
@blocked_thread = Thread.current
end
# This loop is a safe guard against accidental wakeup of thread
loop do
@data_lock.synchronize do
if @closed
return @response
end
end
# FIXME: If context switch happens here the thread will be permanently frozen.
Thread.stop # Stop current thread and wait for call to close()
end
end
def close(response)
@data_lock.synchronize do
@closed = true
@response = response
Thread.pass # An attempt at minimizing the risk of permanently freezing threads
if @blocked_thread.is_a? Thread and @blocked_thread.status == 'sleep'
@blocked_thread.wakeup
end
end
end
它应该工作的方式是调用get_response将阻止当前线程,当另一个线程调用close()的第一个线程应该被唤醒并返回通过@response发送的值。
这应该适用于所有情况,除非第二个线程在第一个线程停止并且在第一个线程停止之前有一个上下文切换的情况下会关闭。我怎样才能删除这个(不太可能)的可能性?
感谢,这正是我需要的! –
@AndreasHagelberg我很高兴它是有帮助的!如果你愿意,你可以点击向上三角形来投票(这是我们在这里展示的欣赏)。还有一个复选标记,您可以点击以显示这是帮助您的最佳答案。 –
我已经向上投票了,但不幸的是我没有足够的声望让它公开显示。虽然我错过了选中标记,但我现在已经检查过了。 –