代码之家  ›  专栏  ›  技术社区  ›  SFEley

在Ruby1.9中自动加载线程是否安全?

  •  15
  • SFEley  · 技术社区  · 15 年前

    在我看来,Ruby社区从那以后就开始对Autoload有些担心了。 this famous thread ,由于线程安全原因,禁止使用它。

    有人知道这在Ruby1.9.1或1.9.2中是否不再是一个问题吗?我已经看到过一些关于包装需要使用互斥锁之类的内容的讨论,但是1.9的变更日志(或者至少是我所能找到的)似乎没有解决这个特定的问题。我想知道我是否可以合理地在1.9-only库中开始自动加载,而不需要任何合理的悲伤。

    提前感谢您提供任何见解。

    3 回复  |  直到 13 年前
        1
  •  7
  •   user24359    15 年前

    我不知道一般情况,但从该线程中复制示例不会在1.9.1中中断:

    AutooDeD.Rb:

    sleep 1
    Bar::Foo = 1
    

    AutoLoad

    module Bar
       autoload :Foo, 'autoloaded.rb'
    end
    
    t1 = Thread.new { Bar::Foo }
    t2 = Thread.new { Bar::Foo }
    t1.join; t2.join
    
        2
  •  9
  •   Denis de Bernardy    14 年前

    带来了2011年的更新,因为我也很好奇。

    当前打开了两张票:

    核心开发人员建议,在cruby/jruby 1.9中,需求和自动加载以相同的方式工作,并且是线程安全的。从这个意义上说,Ruby在文件完全加载之前一直保持一个锁。

    然而,这会带来潜在的死锁带来不便的副作用。明确地:

    1. TH1加载并锁定
    2. TH2加载B并锁定
    3. TH1试图加载B作为加载A的一部分,开始等待TH2
    4. TH2试图加载A作为加载B的一部分,开始等待TH1
    5. 死锁…

    结论可能是:如果应用程序中存在死锁的可能性,那么在启动线程之前需要所有东西。

        3
  •  -4
  •   Wayne Conrad    13 年前

    它总是坏的。

    Subload允许您在线程环境中切换模式。

    我仍然在线程环境中使用autoload,但只在单线程引导过程中使用。我看不出在现实世界的应用程序中有多线程启动过程的任何好理由。如果您确实有一个,那么您可能需要排队操作来加载共享库,因为在类和实例级设置中始终存在线程安全问题,大多数情况下都是这样的:

    class Lib
      extend SomeClassFuncs
      do_something_with_class_funcs
    end
    

    无论加载器是什么,这个代码在加载时都不是线程安全的。

    如果你看不到这个,你就不应该穿线。

    推荐文章