【问题标题】:Fast Thread-Safe Ruby Hash with strong read bias具有强读取偏差的快速线程安全 Ruby 哈希
【发布时间】:2012-02-13 18:31:00
【问题描述】:

我需要一些帮助来理解 Ruby 1.8.7 中的 Hash。

我有一个多线程 Ruby 应用程序,大约 95% 的时间应用程序的多个线程都在尝试访问全局哈希。

我不确定默认的 Ruby Hash 是否是线程安全的。考虑到我的情况,拥有快速哈希但又是线程安全的最佳方法是什么?

【问题讨论】:

  • 对此哈希执行了哪些操作?通常,您希望使用互斥锁来操作线程共享资源。
  • 您是要读取还是更改哈希?读取是安全的。
  • @theTinMan:我有几个线程经常从哈希中读取。写入哈希的速度要慢得多。我需要确保在尝试同步写入时不会降低读取速度。
  • 我认为你也可以使用mutex。减慢读取应该不是问题,因为写入/更新会非常快。写一个benchmark 可以证明/反驳这一点。
  • @Fanatic23,您有兴趣查看读写锁的实现吗?如果你不熟悉这个术语,它就像一个互斥体,但它允许任意数量的读取器同时运行,但只有一个写入器(一旦写入器获得锁,所有读取器都必须等待)。跨度>

标签: ruby multithreading


【解决方案1】:

默认的 Ruby Hash 不是线程安全的。在 MRI 和 YARV 上,它“有点意外地是线程安全的”,因为 MRI 和 YARV 有一个损坏的线程实现,无论如何都无法同时运行两个线程。然而,在 JRuby、IronRuby 和 Rubinius 上,情况并非如此。

【讨论】:

    【解决方案2】:

    我建议使用一个使用读写锁保护Hash 的包装器。我找不到预先构建的 Ruby 读写锁实现(当然 JRuby 用户可以使用 java.util.concurrent.ReentrantReadWriteLock),所以我构建了一个。您可以在以下位置查看:

    https://github.com/alexdowad/showcase/blob/master/ruby-threads/read_write_lock.rb

    我和另外两个人已经在 MRI 1.9.2、MRI 1.9.3 和 JRuby 上对其进行了测试。它似乎工作正常(尽管我仍然想做更彻底的测试)。它有一个内置的测试脚本;如果你有多核机器,请下载,尝试运行,告诉我结果!就性能而言,它在读取偏差的情况下击败了 Mutex。即使在 80-90% 写入的情况下,它仍然似乎比使用 Mutex 快一点。

    我还打算做一个 Java 的 ConcurrentHashMap 的 Ruby 端口。

    【讨论】:

    • 请注意,您必须先安装出色的“原子”gem,来自 Charles Nutter 和 MeNTaLGuY!
    • @Alex_D 我对您的回答有类似的问题。主要是,我宁愿不使用您的代码,而宁愿只使用 Atomic 库,如果确实足够的话。可以看看吗:Using Threadsafe Initialization in a JRuby Gem
    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多