问题
Suppose:
- There is some object (e.g., an array
a
) and a condition dependent on the object (e.g., such asa.empty?
). - Some threads other than the current thread can manipulate the object (
a
), so the truthness of the evaluated value of the condition changes over the time.
How can I let the current thread sleep at some point in the code and continue (wake up) by push notification when the condition is satisfied?
I do not want to do polling like this:
...
sleep 1 until a.empty?
...
Perhaps using Fiber
will be a clue.
回答1:
Maybe I do not quite understand your question, but I guess ConditionVariable
is a good approach for such problem.
So, ConditionVariable
can be used to signal threads when something happens. Let's see:
require 'thread'
a = [] # array a is empty now
mutex = Mutex.new
condvar = ConditionVariable.new
Thread.new do
mutex.synchronize do
sleep(5)
a << "Hey hey!"
# Now we have value in array; it's time to signal about it
condvar.signal
end
end
mutex.synchronize do
condvar.wait(mutex)
# This happens only after 5 seconds, when condvar recieves signal
puts "Hey. Array a is not empty now!"
end
来源:https://stackoverflow.com/questions/17636746/waking-up-by-push-notification