2

そのため、私たちはアプリの問題をデバッグしようとしていますが、スレッドの問題に絞り込んだと考えています。

Ruby の Thread に関するドキュメントに基づいて、join メソッドに整数引数を指定すると、nil を返す前にスレッドが参加するまで待機する時間が指定されることを理解しています。

ただし、「0」を渡すとどうなるかはわかりません。

私の同僚の 1 人は、Ruby インタープリターの C コードを掘り下げた後、「まったく待たずにすぐに参加し、戻ってこない場合は nil を返す」ではないと考えているようです。 「参加を気にせず、特定の瞬間のスレッドのスナップショットを返すだけです」の行。

join() に「0」引数を渡すとどうなるかについて、誰かが私にいくつかのドキュメントを指摘できますか (または単に教えてください)?

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

fg非常に似ています。この理由は、fが単なる限界であるためです。可能な限り小さい数を入力してください。そして、それらは同じことを意味します。スレッドが完了したかどうかを確認するために、事実上すぐにチェックしてください。そうでない場合は、nilを返します。

したがって、上記のコードでは、untilは最初の2つのケースで繰り返し評価されますが、3番目のケースでは数回しか評価されません(特に、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 に答える