Ruby: существует ли блокировка ресурса в потоке при записи?
Планируется многопоточное приложение, в котором несколько потоков будут читать переменную,
при этом иногда эту переменную нужно перезаписывать.
Значит требуется что бы эта переменная не блокировалась при чтении из нескольких потоков, но при попытке записи блокировалась для всех кроме записывающего потока.
можно ли с помощью руби такое сделать?
я с потоками и с руби не "на ты", разобрался только с простейшим примером использования мьютексов.
где то прочитал про RWmutex, так понял что как раз они мне нужны.
-есть ли RWmutex в руби или можно ли как то сделать подобное другими средствами?
-если можно - ткните куда копать (или примерчик, простейший))) )
-может такое на Python есть? я его тоже не знаю так что питон тоже можно использовать..
не понятно чем вам не угадили стандартные мютексы. Потоки ж будут блокироваться только при попытке захватить власть, когда им этого не положено. То есть только при записи. При чтении блокировать если нужно, что бы у потоков всегда были актуальные данные - тогда семафоры.
вполне возможно я не въехал как работает мьютекс.
например в таком псевдокоде:
# var - наш ресурс.
def read()
put var
return
def update()
mutex.lock()
var=big_data_writer()
mutex.unlock()
return
если так, в функции read доступ к var будет всегда? чтение var процесс долгий у меня, и не получится ли что мы половину прочитали, тут бац, апдейт пришел, вторую половину var мы дочитали уже из обновленной версии.получилась каша.
или это все не правильно)) ?
нет - это у меня первый опыт использования руби и тем более многопоточности.
все что я понял про GIL - потоки вывполняются не одномоментно, а по очереди. если это верно то это не приближает меня к ответу.
ведь то что потоки выполняются по очереди не гарантируют того что данные будут читаться и писаться в обьект по очереди - ведь это не атомарные операции.
мне пока интересно только одно: как сделать не блокирующее чтение и блокирующую запись.
Моя реплика была на "Планируется многопоточное приложение". Странно его планировать на языках с GIL.
Вообще есть реализации интерпретатора руби без GIL, например JRuby, про питон не в курсе. Ну и как вам уже написали - для такой синхронизации используются мутексы
@vsuhachev аа понятно.
но мне GIL не помешает. мне не скорость нужна, а как раз псевдопараллельность. что бы два пользователя могли работать одновременно с программой. и не важно что по факту они работают последовательно, просто очень часто "чередуясь".
а мне нужно написать, а уж потом изучить язык и переписать заново. человек я подневольный. сказали - пиши, а то что не знаешь руби, неважно.
ну и интерес тоже присутствует, есть реальная задача - интереснее изучать будет.
руби выбран из за наличия библиотеки (win32 event viewer)
может решения уже есть - все равно хочется попробовать.