2012-03-24 12 views
7

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.

+1

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

+3

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. –

+0

Ich denke, was ich fragen wollte, wäre ich in Schwierigkeiten geraten mit '|| =' mit Threads? –

Antwort

1

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.

0

Dieser tolle Post auf thread safety concepts in Ruby von Luca Guidi zeigt, dass ||= nicht Thread-sicher ist (zumindest in MRI).

+0

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