我需要编写一个执行后台程序的Ruby程序,并在其上执行一些功能。
在执行任何操作之前,主线程需要确保后台线程已启动。什么是正确的模式?
这不完全是:
condition = ConditionVariable.new
mutex = Mutex.new
thread = Thread.new do
mutex.synchronize { condition.signal }
# background work
end
mutex.synchronize { condition.wait(mutex) }
# other work
因为:signal
可以在:wait
之前执行,阻止主线程。
一个确切的解决方案是:
thread = Thread.new do
Thread.current[:started] = true
# background work
end
sleep 0.01 while thread[:started].nil?
# other work
然而,它使用sleep
,我想避免使用。{/ p>
另一个确切但更复杂的解决方案是:
mutex = Mutex.new
condition = ConditionVariable.new
thread = Thread.new do
mutex.synchronize do
Thread.current[:started] = true
condition.signal
end
# background work
end
mutex.synchronize do
condition.wait(mutex) if !thread[:started]
end
# other work
是否有任何确切,简单和惯用的方法来构建此功能?