Verwenden der Klasseninstanzvariablen für Mutex in Ruby
Hinweis: Die unten gezeigte Code-Zusammenfassung istnicht eine destillation des codes mit dem ich das problem hatte. Ich habe diese ursprüngliche Zusammenfassung hier gelassen, da bereits jemand anders geantwortet hat, aber dertatsächlich Code wird in der Antwort gezeigt, die ich unten zur Verfügung gestellt habe.
Ich konnte dies nicht auf einen kleinen fehlgeschlagenen Testfall eingrenzen, erhalte jedoch einen Fehler mit dem folgenden allgemeinen Konstrukt:
class Foo
@mutex = Mutex.new
....
def self.bar
@mutex.synchronize { ... }
end
end
Wenn ich mehrere Threads aufrufeFoo.bar
, manchmal@mutex
werde auswerten zunil
imbar
. Wenn ich anstelle einer Instanzvariablen eine Konstante (z. B. MUTEX) verwende, habe ich dieses Problem nicht.
Ich weiß nicht, ob es von Bedeutung ist, aber ich verwende JRuby auf einem Multi-Core-Rechner.
Ich würde mich über jede Erklärung oder Hilfe bei der Eingrenzung des Problems freuen.
Update: Ich glaube, das hängt mit dem automatischen Laden zusammen. Mit Rails konnte ich ein ähnliches Problem mit folgendem Inhalt reproduzierenfoo.rb
in einem der Verzeichnisse Rails autoloads von:
class Foo
@mutex = Mutex.new
def self.bar
@mutex.synchronize {}
end
end
Wenn ich dann folgendes in der Rails-Konsole ausführe:
1.upto(4).map { Thread.new { Foo.bar }}.map(&:join)
Ich erhalte folgenden Fehler:
RuntimeError: Circular dependency detected while autoloading constant Foo
from /Users/palfvin/.rvm/gems/jruby-1.7.10@javlats/gems/activesupport-4.0.1/lib/active_support/dependencies.rb:461:in `load_missing_constant'
from /Users/palfvin/.rvm/gems/jruby-1.7.10@javlats/gems/activesupport-4.0.1/lib/active_support/dependencies.rb:184:in `const_missing'
from (irb):1:in `evaluate'
und dieses Verhalten ist dasselbe in CRuby (MRI Ruby).