Question

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.

Was it helpful?

Solution

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top