Fast Thread-Safe Ruby Hash с сильным смещением чтения - PullRequest
3 голосов
/ 13 февраля 2012

Мне нужна помощь в понимании хэша в Ruby 1.8.7.

У меня есть многопоточное приложение Ruby, и около 95% времени несколько потоков приложения пытаются получить доступ к глобальному хэшу.

Я не уверен, является ли Ruby Hash по умолчанию потокобезопасным. Каков наилучший способ получить быстрый хэш, но также и потокобезопасный, учитывая мою ситуацию?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Ruby Hash по умолчанию не является потокобезопасным.В MRI и YARV это «несколько случайно поточнобезопасно», потому что MRI и YARV имеют реализацию с прерывистыми потоками, которая в любом случае не способна запускать два потока одновременно.На JRuby, IronRuby и Rubinius, однако, это не так.

1 голос
/ 14 февраля 2012

Я бы предложил оболочку, которая защищает Hash с помощью блокировки чтения-записи.Я не смог найти готовую реализацию блокировки чтения-записи Ruby (конечно, пользователи JRuby могут использовать java.util.concurrent.ReentrantReadWriteLock), поэтому я создал ее.Вы можете увидеть это по адресу:

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

Я и два других человека проверили его на МРТ 1.9.2, МРТ 1.9.3 и JRuby.Кажется, он работает правильно (хотя я все еще хочу сделать более тщательное тестирование).Имеет встроенный тестовый скрипт;если у вас многоядерный компьютер, пожалуйста, скачайте, попробуйте запустить его, и дайте мне знать результаты!Что касается производительности, то это мешает Mutex в ситуациях с смещением чтения.Даже в ситуациях с 80-90% операций записи все же кажется немного быстрее, чем при использовании Mutex.

Я также планирую создать порт Ruby для Java ConcurrentHashMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...