什么是等待后台线程启动的正确Ruby模式?

时间:2018-03-08 19:30:25

标签: ruby multithreading condition-variable thread-synchronization

我需要编写一个执行后台程序的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

是否有任何确切,简单和惯用的方法来构建此功能?

1 个答案:

答案 0 :(得分:1)

您可以使用Queue

self ++ other

Queue#pop将等待一个项目可用并将其返回。