Nicht sicher, ob die Sicherheit der Gewinde auch für ||=
gilt.Ist || = in Ruby threadsicher?
War ursprünglich über ActiveSupport::Memoizable lesen und fragte mich über Thread-Sicherheit dort.
Nicht sicher, ob die Sicherheit der Gewinde auch für ||=
gilt.Ist || = in Ruby threadsicher?
War ursprünglich über ActiveSupport::Memoizable lesen und fragte mich über Thread-Sicherheit dort.
Es hängt von der Implementierung ab. Beachten Sie, dass x ||= y
auf x || x = y
erweitert wird und dass x = y
nur ausgeführt wird, wenn x
weder false
noch nil
ist.
Mit diesem gesagt, sollte die C-Implementierung der Ruby-Sprache vollständig threadsicher sein.
YARV verwendet native Threads, um Nebenläufigkeit zu implementieren, die tun in True parallel ausführen. Um die Rückwärtskompatibilität aufrechtzuerhalten, wurde jedoch eine global, interpreter-wide lock eingeführt.
JRuby, jedoch keine interne Sperre auf Ihrem Code, so müssen Sie manuell synchronisieren Sie Ihre Anrufe bei Bedarf.
Weitere Details finden Sie unter another answer I've given about the subject. Lesen Sie auch this excellent answer by Jörg W Mittag, um sich die Threading-Modelle der verschiedenen Ruby-Implementierungen genauer anzusehen.
Dieser tolle Post auf thread safety concepts in Ruby von Luca Guidi zeigt, dass ||=
nicht Thread-sicher ist (zumindest in MRI).
Gilt das nur für '@ instance'-Variablen? Oder kann '|| =' für Methodenvariablen trotzdem sicher sein, wenn in dieser Methode keine neuen Threads erstellt werden? – Kelseydh
Meinst du "Ist es eine atomare Operation?", "Kann es eine Verzögerung zwischen Test und Zuweisung geben", dann nein, ich sehe keine solche Garantie. – j13r
Eine Zuweisung ist threadsafe, wenn die Variable in einem threadsafe Bereich ist. Wenn Sie also eine globale Variable haben, wird eine Zuweisung nicht threadsicher oder, wenn mehrere Threads dieser Variablen gleichzeitig zugewiesen werden können. Deine Frage ergibt keinen Sinn. –
Ich denke, was ich fragen wollte, wäre ich in Schwierigkeiten geraten mit '|| =' mit Threads? –