Mutex vs Monitor в Ruby

Если вы разрабатываете многопоточную программу, то вы должны быть в курсе, что доступ к общим ресурсам необходимо защищать замком. В Ruby для этого в большинстве случаев используют Mutex, с помощью которого как раз и создают эксклюзивную блокировку: доступ к ресурсу получает только один поток, который эту блокировку захватил. Но даже и в этом случае вы можете получить взаимную блокировку - например, если будете использовать рекурсию и попытаетесь повторно захватить уже заблокированный замок тем же самым потоком: ``` @mut = Mutex.new @mut_count = 0 def mut_repeat(n) return if n == 0 @mut.synchronize do @mut_count += 1 mut_repeat(n - 1) end end Thread.new { mut_repeat(10) }.join # Thread::Mutex#synchronize': deadlock; recursive locking (ThreadError) puts @mut_count ``` Исправить эту ошибку можно очень просто: вам нужно добавить дополнительную проверку на захват замка (см. пример на скриншоте). Или использовать более простое решение: вместо объекта класса Mutex сделать выбор в пользу объекта Monitor. А какими объектами синхронизации пользовались вы при написании своих программ? Встречались ли в вашей практике ошибки, связанные с взаимоблокировками? Каким образом вы их находили и как исправляли?

#Ruby #Mutex #Monitor #Thread #Sync #Exclusive #Lock

Mutex vs Monitor в Ruby | Сетка — социальная сеть от hh.ru