当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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]。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。