2

因此,我们正在尝试调试我们的应用程序的问题,并且我们认为我们已将其范围缩小到线程问题。

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

但是,我不确定当您传入“0”时会发生什么。

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

任何人都可以指出一些关于(或直接告诉我)将“0”参数传递给 join() 的文档吗?

4

2 回答 2

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

f并且g非常相似。这样做的原因是 f 只是极限 - 放入尽可能小的数字。他们的意思是一样的。几乎立即检查线程是否已完成。如果不是,则返回 nil。

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

恐怕你的同事不正确。

于 2012-12-11T16:24:47.540 回答
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)

请参阅加入文档

于 2012-12-11T15:39:27.327 回答