當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Ruby Thread.thr[sym]用法及代碼示例


本文簡要介紹ruby語言中 Thread.thr[sym] 的用法。

用法

thr[sym] → obj or nil

屬性引用 - 使用符號或字符串名稱返回 fiber-local 變量的值(如果沒有明確在 Fiber 內,則返回當前線程的根纖程)。如果指定的變量不存在,則返回 nil

[
  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-local。這種混淆在 Ruby 1.8 中不存在,因為纖維僅在 Ruby 1.9 之後才可用。 Ruby 1.9 選擇方法行為 fiber-local 來保存動態範圍的以下慣用語。

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

如果方法是線程本地的並且給定的塊切換光纖,則該習慣用法可能無法用作動態範圍。

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.)

對於線程局部變量,請參見 thread_variable_get thread_variable_set

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Thread.thr[sym]。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。