ループ内にスレッドを作成していますが、特定の各スレッドの名前としてループfor
を使用したいと思います。これを実行すると、、、、を取得する代わりに、、を取得します。変数をスレッドに渡すためのより良い/より安全な方法はありますか?for
i
1
2
2
1
2
2
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
ループ内にスレッドを作成していますが、特定の各スレッドの名前としてループfor
を使用したいと思います。これを実行すると、、、、を取得する代わりに、、を取得します。変数をスレッドに渡すためのより良い/より安全な方法はありますか?for
i
1
2
2
1
2
2
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
あなたの問題は、i
参照しているがスレッドに渡されたブロック変数ではなく、スレッドのi
外部で定義されていることです。それに追加する必要があり、 、またはの|i|
いずれかが得られます。1
2
2
1
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)
ブロックを介して変数を渡すことができます
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