在我看来,自从 Ruby 社区开始对自动加载感到有点害怕这个著名的线程 http://www.ruby-forum.com/topic/172385,出于线程安全原因不鼓励使用它。
有谁知道这在 Ruby 1.9.1 或 1.9.2 中是否不再是问题?我见过一些关于在互斥锁等中包装 require 的讨论,但是 1.9 变更日志(或者至少是我能找到的那么多)似乎并没有解决这个特定的问题。我想知道我是否可以合理地开始在仅限 1.9 的库中自动加载,而不会产生任何合理的悲伤。
预先感谢您的任何见解。
对此进行了 2011 年更新,因为我也对此感到好奇。
目前已开放两张票:
- http://redmine.ruby-lang.org/issues/921 http://redmine.ruby-lang.org/issues/921
- http://jira.codehaus.org/browse/JRUBY-3194 http://jira.codehaus.org/browse/JRUBY-3194
核心开发人员建议,在 CRuby/JRuby 1.9 中,require 和 autoload 以相同的方式工作并且是线程安全的。从某种意义上说,Ruby 会一直锁定直到文件完全加载。
然而,这会带来不便的副作用,即引入潜在的死锁。具体来说:
- Th1加载A并锁定它
- Th2加载B并锁定它
- Th1 尝试加载 B 作为加载 A 的一部分,开始等待 Th2
- Th2 尝试加载 A 作为加载 B 的一部分,开始等待 Th1
- 僵局...
结论可能是:如果您的应用程序中存在死锁的可能性,则在启动线程之前需要您需要的一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)