因此,我们正在尝试使用我们的应用调试问题,我们认为我们已将其缩小为线程问题。
我理解基于Ruby的Thread文档,为join方法提供一个整数参数指定在返回nil之前等待线程加入的时间。
但是,我不确定传递'0'时会发生什么。
我的一位同事在挖掘了Ruby解释器的C代码之后,似乎认为它不是“根本不等待立即加入它并且如果它不回来则返回nil”并且是更多的是“不要打扰加入,只是在给定时刻返回线程的快照。”
任何人都可以向我指出一些文档(或者只是告诉我)将'0'参数传递给join()的是什么?
答案 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
f
和g
非常相似。
原因是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)