Pregunta

Suppose:

  • There is some object (e.g., an array a) and a condition dependent on the object (e.g., such as a.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.

¿Fue útil?

Solución

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top