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我很高興它是有幫助的!如果你願意,你可以點擊向上三角形來投票(這是我們在這裏展示的欣賞)。還有一個複選標記,您可以點擊以顯示這是幫助您的最佳答案。 –
我已經向上投票了,但不幸的是我沒有足夠的聲望讓它公開顯示。雖然我錯過了選中標記,但我現在已經檢查過了。 –