2

ループ内にスレッドを作成していますが、特定の各スレッドの名前としてループforを使用したいと思います。これを実行すると、、、、を取得する代わりに、、を取得します。変数をスレッドに渡すためのより良い/より安全な方法はありますか?fori122122

ts = []
for i in 1..2 do
  ts.push( Thread.new(i) do
    x = i
    puts x
  end)
end
ts.each do |t|
  t.join()
end
4

2 に答える 2

3

あなたの問題は、i参照しているがスレッドに渡されたブロック変数ではなく、スレッドのi外部で定義されていることです。それに追加する必要があり、 、またはの|i|いずれかが得られます。1221

ts = []
for i in 1..2 do
  ts.push( Thread.new(i) do |i|
    x = i
    puts x
  end)
end
ts.each do |t|
  t.join()
end

ちなみに、よりルビっぽい書き方は次のとおりです。

ts = (1..2).map do |i|
  Thread.new(i) do |i|
    puts i
  end
end.each(&:join)

各スレッドに固有の名前を探している場合は、スレッドのオブジェクト ID を使用することをお勧めします。

ts = (1..2).map do
  Thread.new do
    puts Thread.current.object_id
  end
end.each(&:join)
于 2012-12-06T17:04:05.927 に答える
2

ブロックを介して変数を渡すことができます

ts = []

for i in 1..2 do
  ts.push( Thread.new(i) do |i|
    x = i
    puts x
  end)
end

ts.each do |t|
  t.join()
end

# => 1
# => 2
于 2012-12-06T17:00:51.287 に答える