具有强读取偏差的快速线程安全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上,情况并非如此。