Fanatic23
Fanatic23

Reputation: 3428

Fast Thread-Safe Ruby Hash with strong read bias

I need some help in understanding Hash in Ruby 1.8.7.

I have a multi-threaded Ruby application, and about 95% of time multiple threads of the application are trying to access a global Hash.

I am not sure if the default Ruby Hash is thread safe. What would be the best way to have a fast Hash but also one that is thread safe given my situation?

Upvotes: 3

Views: 1286

Answers (2)

Alex D
Alex D

Reputation: 30445

I would suggest a wrapper which protects the Hash with a read-write lock. I couldn't find a pre-built Ruby read-write lock implementation (of course JRuby users can use java.util.concurrent.ReentrantReadWriteLock), so I built one. You can see it at:

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

Me and two other people have tested it on MRI 1.9.2, MRI 1.9.3, and JRuby. It seems to be working correctly (though I still want to do more thorough testing). It has a built-in test script; if you have a multi-core machine, please download, try running it, and let me know the results! As far as performance goes, it trounces Mutex in situations with a read bias. Even in situations with 80-90% writes, it still seems a bit faster than using a Mutex.

I am also planning to do a Ruby port of Java's ConcurrentHashMap.

Upvotes: 1

Jörg W Mittag
Jörg W Mittag

Reputation: 369478

The default Ruby Hash is not thread-safe. On MRI and YARV it is "somewhat accidentally thread-safe", because MRI and YARV have a broken threading implementation that is incapable of running two threads simultaneously anyway. On JRuby, IronRuby and Rubinius however, this is not the case.

Upvotes: 2

Related Questions