具有强读取偏差的快速线程安全Ruby Hash

时间:2012-02-13 18:31:01

标签: ruby multithreading

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

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

我不确定默认的Ruby Hash是否是线程安全的。根据我的情况,拥有快速哈希的最佳方法是什么,但也是一个线程安全的方法?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我建议使用读写锁保护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%的情况下,仍然似乎比使用互斥锁更快。

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