From: "luke-gru (Luke Gruber) via ruby-core" Date: 2023-01-25T16:30:43+00:00 Subject: [ruby-core:112038] [Ruby master Bug#19376] Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe Issue #19376 has been reported by luke-gru (Luke Gruber). ---------------------------------------- Bug #19376: Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe https://bugs.ruby-lang.org/issues/19376 * Author: luke-gru (Luke Gruber) * Status: Open * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- This segfaults: ```ruby class C class << self attr_accessor :val end end GO = false rs = 100.times.map do Ractor.new do Thread.pass until GO 1000.times do val = C.val p val end end end ts = 100.times.map do |i| Thread.new do Thread.pass until GO 1000.times do C.val = Object.new.freeze end end end GO = true ts.each(&:join) rs.each(&:take) ``` It looks like a silly example, but it can crash even if the main thread doesn't spawn any more threads. Getting/setting ivars on objects in parallel without VM lock isn't safe, so for non-frozen shareable objects (basically classes and modules), it's unsafe to access their instance variables even if the values are shareable. -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/