【问题标题】:How is Ruby /lib/time.rb thread-safe?Ruby /lib/time.rb 如何是线程安全的?
【发布时间】:2015-12-01 05:20:33
【问题描述】:

在查看 RSS stdlib monkey 修补 Time 类时,我发现全局变量 $1 $2 $3 ... 在那里大量使用。好吧,我可以不用同时制作多个 RSS 提要。

但我在这里发现了同样的恐怖:
- /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0//time.rb
在这里:
- https://github.com/ruby/ruby/blob/c8b3f1b470e343e7408ab5883f046b1056d94ccc/lib/time.rb

Ruby /lib/time.rb 如何在没有线程错误的情况下工作?!

【问题讨论】:

    标签: ruby datetime thread-safety global-variables standard-library


    【解决方案1】:

    $1$2 等是保存正则表达式匹配结果的特殊全局变量,内部是 thread-local variable,因此,使用它们的代码是线程安全的

    这是Ruby Documentation的摘录,

    特殊的全局变量

    模式匹配设置一些全局变量:

    • $~ 等价于 ::last_match;
    • $& 包含完整匹配的文本;
    • $` 包含匹配前的字符串;
    • $' 包含匹配后的字符串;
    • $1、$2 等包含匹配第一、第二等捕获组的文本;
    • $+ 包含最后一个捕获组。

    这些全局变量是线程局部变量和方法局部变量。

    下面的例子:

    Thread.new {
      "A B C".match(/(\w)/)
      p $1 # Prints "A"
    
      Thread.new {
        "X Y Z".match(/(\w)/)
        p $1  # Prints X
      }.join
    
      p $1 # Prints "A", shows that $1 was not corrupted by inner thread
    
    }.join
    

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 2016-05-05
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 2013-02-17
      • 2011-06-07
      • 1970-01-01
      相关资源
      最近更新 更多