在 Ruby 中使用类实例变量作为互斥体

2023-12-09

Note:下面显示的代码摘要是not我遇到问题的代码的精炼。因为其他人已经回答了,所以我将原始摘要留在这里,但是actual代码显示在我下面提供的答案中。

我无法将其与一个小的失败测试用例隔离,但我在以下一般构造中遇到了失败:

class Foo

  @mutex = Mutex.new

  ....

  def self.bar
    @mutex.synchronize { ... }
  end

end

如果我创建多个线程调用Foo.bar, 有时@mutex将评估为nil in bar。如果我使用常量(例如 MUTEX)而不是实例变量,则不会出现此问题。

我不知道这是否重要,但我在多核机器上运行 JRuby。

我希望得到有关如何隔离问题的任何解释或帮助。

更新:我相信这与自动加载有关。使用 Rails,我能够通过以下内容重现类似的问题foo.rb在 Rails 自动加载的目录之一中:

class Foo
  @mutex = Mutex.new
  def self.bar
    @mutex.synchronize {}
  end
end

当我在 Rails 控制台中执行以下命令时:

1.upto(4).map { Thread.new { Foo.bar }}.map(&:join)

我收到以下错误:

RuntimeError: Circular dependency detected while autoloading constant Foo
    from /Users/palfvin/.rvm/gems/jruby-1.7.10@javlats/gems/activesupport-4.0.1/lib/active_support/dependencies.rb:461:in `load_missing_constant'
    from /Users/palfvin/.rvm/gems/jruby-1.7.10@javlats/gems/activesupport-4.0.1/lib/active_support/dependencies.rb:184:in `const_missing'
    from (irb):1:in `evaluate'

这种行为在 CRuby (MRI Ruby) 中是相同的。


类变量会发生这种情况吗?@@mutex。在线程和新副本之间创建新的类实例可能会出现竞争条件@mutex还没准备好。然而,常量和类变量在类和子类的副本之间共享。另外,如果你把@mutex记忆方法中的初始化代码,例如:

def self.mutex
  @mutex ||= Mutex.new
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Ruby 中使用类实例变量作为互斥体 的相关文章

  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • 使用 attr_accessor 动态创建类属性

    在Ruby中 有没有办法动态地将实例变量添加到类中 例如 class MyClass def initialize create attribute name end def create attribute name attr acces
  • “rmagick”gem 安装问题

    我在尝试在 centos 上安装 rmagick gem 时遇到问题 以下是我得到的输出 谁能帮我识别一下我缺少什么包裹 我已经安装了所有提到的另一个堆栈溢出线程 RMagick安装错误 https stackoverflow com qu
  • Nokogiri 保持 HTML 实体不变

    我希望 Nokogiri 保持 HTML 实体不变 但它似乎正在将实体转换为实际的符号 例如 Nokogiri HTML fragment p reg p to s 结果是 p p 似乎没有什么可以将原始 HTML 返回给我 inner h
  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被
  • 在 ruby​​ 中下载多个 FTP 文件,如 d*.txt

    我需要连接到 ftp 站点并下载一堆名为 D txt 的文件 最多 6 个 你能帮我用 Ruby 编写这个代码吗 下面的代码只是 ftp Net FTP new ftp server site ftp login user pwd ftp
  • 在 Ruby 中创建一个空文件:相当于“touch”?

    创建一个的最佳方式是什么emptyRuby 中的文件 类似于 Unix 命令的东西 touch https en wikipedia org wiki Touch 28Unix 29 touch file txt FileUtils tou
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • jruby 的路边(卷曲)?

    我正在尝试将curl 与jruby 结合使用来获得网页 文件的一些响应时间 通常在 ruby 中这不会是一个问题 我可以安装 gem gem install junction 一切都很好 遏制似乎与 jruby 不兼容 那么有没有一种替代方
  • Shoulda/RSpec 匹配器 - 条件验证

    在我的代码中 我使用 Shoulda 匹配器进行了以下验证 效果很好 it should validate presence of name 在我的模型中 我已将条件添加到验证中 validates presence of name if
  • 如何在不饥饿的情况下锁定 std::mutex

    在我的程序中 我有一个互斥体和两个线程 这些线程之一经常获取锁 另一个线程尝试获取但必须永远等待 难道释放锁后获取锁的速度太快 以至于其他线程没有机会获得锁 互斥体总是给每个人一个机会吗 如果没有 什么是一个好的解决方案 某种 FIFO 锁
  • Ruby 中的 url_encode

    I read 的文档url encode http rdoc info stdlib erb 1 9 3 ERB Util 3Aurl encode 是否有一个表可以准确地告诉我哪个字符被编码为什么 使用url encode ERB s u
  • 嵌套 has_one 关联的强参数

    我似乎遗漏了一些明显的东西 但我无法允许嵌套的属性has one协会 控制器 def create crossword Crossword new crossword params if crossword save render show
  • Android 上的 SQLite 和 MongoDB 具有同步功能

    是否可以在 Android 上使用 SQLite 在服务器上使用像 MongoDB 这样的 NoSQL 数据库 并在两者之间进行 2 路数据复制 同步 或者最好在两端使用 SQL 或者在两端使用 NoSQL 但不要混合使用 有几种不同的方法
  • 如何声明依赖于参数化任务的 Rake 任务?

    我见过一些任务具有参数和依赖项任务的示例 例如 task name first name last name gt pre name do t args args with defaults first name gt John last
  • Rails 3.2:用 json 序列化中的空字符串替换 null 值

    我正在使用 Rails 3 2序列化 http www simonecarletti com blog 2010 04 inside ruby on rails serializing ruby objects with json 将 ru
  • 处理铁路中 STI 子类路线的最佳实践

    我的 Rails 视图和控制器散布着redirect to link to and form for方法调用 有时link to and redirect to它们链接的路径是明确的 例如link to New Person new per
  • ruby rspec 不能与 simplecov 一起使用

    我安装了 simplecov gem 并添加了 require simplecov SimpleCov start 到spec helper rb文件 现在如果我在some file spec rb文件中包含spec helper rb并尝
  • 更改 en.yml 文件中的属性名称不起作用

    我更改了 ruby on Rails 项目中 en yml 文件中的属性名称 按钮工作正常 但字段属性并没有改变 这是我的模型 class Enr AffordableWarmth lt ActiveRecord Base self tab
  • 如何在 Ruby 中将 DateTime.now 转换为 UTC?

    如果我有d DateTime now 如何将 d 转换为 UTC 带有适当的日期 DateTime now new offset 0 将在标准 Ruby 中工作 即没有 ActiveSupport

随机推荐

  • 如何获取数组中VB.net(VS08)项目中的所有表单?

    好吧 所以我需要一个方法来遍历 Visual Studio 2008 下的 VB net 项目内的所有表单 并创建一个表单类型的数组 并引用其中的所有表单 以便该数组看起来像这样 伪代码 FormsArray Form1 Form2 For
  • 类外的成员函数定义

    是否可以在类声明之外定义函数或方法 例如 class A int foo A foo 10 int A bar return foo 可以在类外部定义但不声明方法 类似于在 C 中创建函数原型然后稍后定义它们的方式 即 class A in
  • 如何解决 org.xmlpull.v1.XmlPullParserException: 意外类型 (position:END_DOCUMENT null@1:1 in java.io.InputStreamReader@40d310f0)

    我使用 jax ws 创建了简单的 Web 服务 我需要在android中使用该网络服务 当我使用该网络服务时 我收到此错误org xmlpull v1 XmlPullParserException unexpected type posi
  • 从C程序执行php脚本并将结果存储到变量中

    我想从 C 程序执行 PHP 脚本并将返回内容存储到 C 变量中 我尝试了以下操作 但它不起作用 C printf calling php function n execl usr bin php q var www html phpinf
  • 为什么使用正则表达式解析 XML 是一个坏主意? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我刚刚回顾了我之前发表的一
  • QML:如何拒绝放置操作

    我有一个DropArea和两个元素 我想DropArea拒绝丢弃事件 如果DropArea已经有一个元素被删除 另一个元素不允许删除 除非第一个元素移出 DropArea property bool dropped false onDrop
  • C++ Qt:从线程重定向 cout 以发出信号

    在单个线程中 我有这个漂亮的类 它将所有 cout 输出重定向到 QTextEdit include
  • Cuda 从设备内存创建 3d 纹理和 cudaArray(3d)

    我正在尝试从设备阵列的一部分创建纹理 3D 为此 我的步骤如下 malloc 设备数组 写入设备数组 创建 CudaArray 3D 将纹理绑定到 CudaArray 我这样做的方式不会产生编译器错误 但是当我运行 cuda memchec
  • SQLite 相当于 ISNULL()、NVL()、IFNULL() 或 COALESCE()

    我想避免在我的代码中进行许多如下检查 myObj someStringField rdr IsDBNull someOrdinal string Empty rdr GetString someOrdinal 我想我可以让我的查询通过执行以
  • Javascript的replace()函数[重复]

    这个问题在这里已经有答案了 这是一个简单的 Replace 问题 我无法让它替换下面函数中的子字符串 function linkOnClick var anyNameYouLike some sort of text string righ
  • 验证 Web Api 服务中的 Azure 移动服务令牌

    我正在尝试在使用 Web Api 服务的跨平台移动应用程序上实现身份验证和识别 我的计划是将身份验证导出到联合云服务 例如新的 Azure 移动服务 客户端移动应用程序将使用移动服务身份验证流程 获取令牌 然后将其在请求标头内发送到 Web
  • 从图像中读取透明像素

    有没有办法使用javascript从图片中读取透明像素 我认为 这可能类似于 PNG 修复对 IE 所做的事情 读取透明像素并应用一些东西 哈哈 但是 是的 对于每个浏览器 啊 如果不用 HTML5 也能实现那就太棒了 这个问题实际上是由来
  • 如何在 QGraphicsView 中启用平移和缩放

    我正在使用 python 和 Qt Designer 来实现加载 tiff 图像并在某些鼠标事件上启用平移和缩放 滚轮 缩放 按滚轮 平移 我正在研究一些可以处理图像等的选项和类 到目前为止我发现 QGraphicsScene QImage
  • 我们怎么知道应用程序不能是 Monad?

    从验证的例子 https hackage haskell org package Validation 我试图直观地检测应用程序如何 为什么不能是 Monad 为什么 AccValidation 不能有 Monad 实例 你能挑战我的推理吗
  • 扩展 sys_file_reference (FAL)

    我想用自己的字段扩展 sys file reference 所以我创建了该字段和 TCA 在后端 该字段可用 但我无法引用流体模板中的该字段 ext tables php CREATE TABLE sys file reference no
  • 如何在jsp中迭代多个属性

    我正在尝试迭代属性文件中的一组键 以便仅输出 message pX a property foo message p1 a message p2 b message p3 c some other property bar 我不知道文件中将
  • Firebase 电话身份验证和链接

    我正在尝试将我的电话号码与我的电子邮件密码身份验证链接起来 所以我使用以下步骤构建我的注册 用户输入电子邮件地址和密码 然后我打电话firebase auth createUserWithEmailAndPassword values em
  • 高分辨率 CSS 精灵

    我正在生成 CSS 精灵 我想以多种尺寸使用这些精灵 我已经搜索过 但无法弄清楚如何在功能上缩放 CSS 精灵 例如如果原始精灵的分辨率为 150x150 而我想以 50x50 显示它 我该怎么做 background size似乎打破了它
  • 强制 ElementTree 使用结束标签

    而不是
  • 在 Ruby 中使用类实例变量作为互斥体

    Note 下面显示的代码摘要是not我遇到问题的代码的精炼 因为其他人已经回答了 所以我将原始摘要留在这里 但是actual代码显示在我下面提供的答案中 我无法将其与一个小的失败测试用例隔离 但我在以下一般构造中遇到了失败 class Fo