Ruby的Thread#join(0)的功能?

时间:2012-12-11 15:32:02

标签: c ruby multithreading

因此,我们正在尝试使用我们的应用调试问题,我们认为我们已将其缩小为线程问题。

我理解基于Ruby的Thread文档,为join方法提供一个整数参数指定在返回nil之前等待线程加入的时间。

但是,我不确定传递'0'时会发生什么。

我的一位同事在挖掘了Ruby解释器的C代码之后,似乎认为它不是“根本不等待立即加入它并且如果它不回来则返回nil”并且是更多的是“不要打扰加入,只是在给定时刻返回线程的快照。”

任何人都可以向我指出一些文档(或者只是告诉我)将'0'参数传递给join()的是什么?

2 个答案:

答案 0 :(得分:2)

在Diego Basch测试代码之后:

def f()
  y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }}
  puts "Waiting" until y.join(0)
end

def g()
  y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }}
  puts "Waiting" until y.join(0.0000000000001)
end

def h()
  y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }}
  puts "Waiting" until y.join(0.15)
end

fg非常相似。 原因是f只是限制 - 尽可能少的数字。 他们的意思是一样的。几乎立即检查线程是否完成。如果不是,请返回nil。

因此,在上面的代码中,until在前两种情况下重复评估,但在第三种情况下仅评估几次(特别是每0.15秒)。使用0作为参数的功能与其他所有数字完全相同 - 检查线程是否在接下来的0秒(现在)中完成,如果它不是返回nil。

我担心你的同事不对。

答案 1 :(得分:0)

你的同事是对的。请尝试以下代码:

y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }}
puts "Waiting" until y.join(0)

与之比较:

y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }}
puts "Waiting" until y.join(0.15)

请参阅the documentation for join