Gibt es ein C ++ - Äquivalent von java.util.concurrent.locks.ReentrantReadWriteLock?

8

Ich möchte den Zugriff auf Getter und Setter für eine Reihe von Datenklassen steuern, um sie gleichzeitig aus mehreren Threads sicher zugänglich zu machen. Ich habe dies in Java vorher mit java.util.concurrent.locks.ReentrantReadWriteLock gemacht und es war ziemlich schmerzlos.

Aber jetzt habe ich eine Menge Probleme in meinem aktuellen C ++ - Projekt, weil ich keine Reentrant-Lese- / Schreibsperre-Implementierung finden kann. Insbesondere möchte ich einen, der es einem Thread ermöglicht, die Lesesperre zu erhalten, wenn er bereits die Schreibsperre hat, ohne zu blockieren und ohne zuerst die Schreibsperre aufzugeben.

Der Grund ist einfach: Einige meiner Setter-Methoden rufen Getter-Methoden auf, und die ersteren erhalten (normalerweise) Schreib-Sperren und die letzteren Lese-Sperren. Ich möchte meine geradlinige Getter / Setter-Architektur nicht verdrehen, nur um Einschränkungen in Lock-Klassen zu umgehen.

Ich habe Qt (4.8) QReadWriteLock und verwandte Klassen und Boost's unique_lock und shared_lock ausprobiert. Keine der beiden Bibliotheken implementiert die erforderliche Reentranz. Berührt das ein anderer Teil von Boost?

Oder gibt es eine andere Bibliothek, die das hat? Ich bin wirklich überrascht, dass weder Qt noch Boost es scheinen, da es so offensichtlich ein wünschenswertes Feature ist. (Und das ist seit 2004 Teil der Java-Standardbibliothek.)

    
Chris 26.06.2013, 17:40
quelle

1 Antwort

3

Ich bin mir nicht sicher, ob Sie diese Funktionalität in einer weit verbreiteten Bibliothek finden, wenn Sie sich mit C ++ in Multi-Threading eingemischt haben. Soweit ich weiß, erlauben Boost-Threads, Std-Threads und POSIX-Threads dies nicht.

Als Ergebnis würde ich zur Lösung Ihres Problems Folgendes vorschlagen:

  1. Sehen Sie sich noch einmal Ihr Sperrschema und die Daten an, die Sie teilen. Gibt es einen anderen Weg, um das zu erreichen, was Sie tun wollen?

  2. Versuchen Sie, Ihre eigene Version der Locking Primatives zu implementieren, die Sie suchen. Es sollte nur eine relativ einfache Erweiterung von Primaten sein, die bereits in der von Ihnen gewählten Bibliothek verfügbar ist. Teilen Sie es auch mit der Community, da Sie sicher nicht die einzige Person mit diesem Problem sind.

It'sPete 27.06.2013 00:33
quelle

Tags und Links