1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
require 'thread'
class MutexFuture
PENDING = Object.new
def initialize
# non-re-entrant lock
@lock = Mutex.new
# allows to block treads until the condition is met
@condition = ConditionVariable.new
@value = PENDING
end
def complete?(value = @lock.synchronize { @value })
value != PENDING
end
def value
# critical section, visibility
@lock.synchronize do
return @value if complete? @value
@condition.wait @lock
@value
end
end
def fulfill(value)
@lock.synchronize do
raise 'already fulfilled' if complete? @value
@value = value
@condition.broadcast
end
self
end
end
|