Actions
Bug #19376
closedAbility to read ivars of non-frozen classes/modules across ractors is not thread-safe
Description
This segfaults:
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.
Updated by luke-gru (Luke Gruber) over 2 years ago
- Tracker changed from Bug to Misc
- Subject changed from Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe to (Please close) Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe
- Backport deleted (
2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN)
Nevermind this is actually safe, I ran into a separate segfault that this example was giving that's unrelated to that thread-safety issue. I'll file separate bug.
Updated by hsbt (Hiroshi SHIBATA) over 2 years ago
- Tracker changed from Misc to Bug
- Subject changed from (Please close) Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe to Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe
- Status changed from Open to Closed
- Backport set to 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
Actions
Like0
Like0Like0