Ruby - Unveränderbare Objekte

8

Ich habe eine in Ruby geschriebene App mit mehreren Multithreads, die ein paar Instanzvariablen teilt. Schreibvorgänge auf diese Variablen sind selten (1%), während Lesevorgänge sehr häufig sind (99%). Was ist der beste Weg (entweder Ihrer Meinung nach oder in der idiomatischen Ruby-Mode), um sicherzustellen, dass diese Themen immer die aktuellsten Werte enthalten? Hier sind einige Ideen, die ich bisher hatte ( obwohl ich deine Eingabe gerne hätte, bevor ich das überarbeite):

  • Verfügen Sie über eine Sperre, die am häufigsten verwendet wird, bevor Sie eine dieser Variablen lesen oder schreiben (aus Java Concurrency in Practice ) ). Der Nachteil davon ist, dass es viele synchronize Blöcke in meinen Code steckt und ich sehe keinen einfachen Weg, dies zu vermeiden.
  • Benutze Rubys freeze Methode (siehe hier ), obwohl sie genauso umständlich aussieht und mir keine gibt der Synchronisierungsvorteile, die die erste Option bietet.

Diese Optionen scheinen beide ziemlich ähnlich zu sein, aber hoffentlich wird jeder da draußen eine bessere Idee haben (oder kann für eine dieser Ideen gut argumentieren). Es wäre auch in Ordnung, die Objekte unveränderlich zu machen, so dass sie während einer Operation nicht beschädigt oder verändert werden, aber ich kenne Ruby nicht gut genug, um den Aufruf alleine zu machen und diese Frage scheint zu argumentieren, dass Objekte sehr veränderlich sind.

    
Chris Bunch 02.01.2009, 22:43
quelle

4 Antworten

6

Die Verwendung der Sperre ist der geeignetste Weg, dies zu tun. Sie können diese Präsentation von Jim Weirich zu dem Thema sehen: Was alle Rubyist wissen sollten Threading .

Auch das Einfrieren eines Objekts hilft Ihnen hier nicht, da Sie diese Variablen ändern möchten. Wenn Sie sie einfrieren, bedeutet dies, dass keine weiteren Änderungen mehr auf diese angewendet werden können (und daher wird Ihre 1% ige Schreibweise nicht funktionieren).

    
Federico Builes 03.01.2009, 17:08
quelle
1

Ich habe es selbst nicht benutzt, aber Sie sollten sich vielleicht Datenfluss . Es macht alle Variablen einmal schreiben.

    
Andrew Grimm 03.04.2010 03:56
quelle
0

Die Leser-Schreiber-Sperre ist ein häufiges Problem mit einer gut definierten Lösung:

Lese-Schreibsperre

und es gibt viele Implementierungen davon:

Schreibsperre schreiben

Sie möchten nicht für jedes Lese- / Schreibzugriffsmodul eine Sperre aktivieren

    
billybob 02.01.2009 22:53
quelle
0

Sie müssen einen Mutex verwenden, um den Zugriff auf den gemeinsamen Status zu synchronisieren. Es gibt wirklich keine Möglichkeit, dies zu vermeiden.

Auf modernen Multi-Core-Rechnern können Sie keine Annahmen darüber treffen, wie auf Speicher zugegriffen wird oder wie Speicherzugriffe mit Caching interagieren.

    
ewalshe 02.01.2009 23:11
quelle