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

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

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

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

我会建议一个使用读写锁来保护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端口。

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