instance method Thread#[]

self[name] -> object | nil[permalink][rdoc]

name に対応したスレッドに固有のデータを取り出します。 name に対応するスレッド固有データがなければ nil を返します。

[PARAM] name:
スレッド固有データのキーを文字列か Symbol で指定します。


[
  Thread.new { Thread.current["name"] = "A" },
  Thread.new { Thread.current[:name]  = "B" },
  Thread.new { Thread.current["name"] = "C" }
].each do |th|
  th.join
  puts "#{th.inspect}: #{th[:name]}"
end

# => #<Thread:0x00000002a54220 dead>: A
# => #<Thread:0x00000002a541a8 dead>: B
# => #<Thread:0x00000002a54130 dead>: C

Thread#[]Thread#[]= を用いたスレッド固有の変数は Fiber を切り替えると異なる変数を返す事に注意してください。


def meth(newvalue)
  begin
    oldvalue = Thread.current[:name]
    Thread.current[:name] = newvalue
    yield
  ensure
    Thread.current[:name] = oldvalue
  end
end

この関数に与えるブロックがFiberを切り替える場合は動的スコープとしては正しく動作しません。


f = Fiber.new {
  meth(1) {
    Fiber.yield
  }
}
meth(2) {
  f.resume
}
f.resume
p Thread.current[:name]
# => nil if fiber-local
# => 2 if thread-local (The value 2 is leaked to outside of meth method.)

Fiber を切り替えても同じ変数を返したい場合は Thread#thread_variable_getThread#thread_variable_set を使用してください。

Thread#[]=