Fädeln sicher C ++ std :: Set, das hinzuzufügen unterstützt, zu entfernen und Iteratoren von mehreren Threads

StackOverflow https://stackoverflow.com/questions/1404717

Frage

Ich suche nach etwas Ähnliches wie die CopyOnWriteSet in Java, eine Reihe, die add, remove und irgendeine Art von iterators von mehreren Threads unterstützt.

War es hilfreich?

Lösung

es nicht ein, die ich kenne, in der Nähe ist in Thread-Bausteine, die concurrent_unordered_map hat

Die STL-Container erlauben gleichzeitige Lesezugriff von mehreren Threads solange Sie dies nicht tun tun, nicht gleichzeitige Modifikation. Oft ist es nicht notwendig zu wiederholen, während das Hinzufügen / Entfernen.

Die Führung über eine einfache Wrapper-Klasse bietet gesund ist, wie ich mit so etwas wie den Code-Schnipsel unter dem Schutz der Methoden beginnen würde, die Sie wirklich gleichzeitigen Zugriff benötigen und dann ‚unsicher‘ Zugriff auf die Basis std :: Bereitstellung so Leute eingestellt kann in die anderen Methoden entscheiden, die nicht sicher sind. Bei Bedarf können Sie den Zugriff auch auf den Erwerb Iteratoren schützen und setzen sie zurück, aber das ist schwierig (noch weniger als Ihr eigenes Schloss frei gesetzt oder Ihre eigene vollständig synchronisiert Schreibset).

I auf der parallelen Musterbibliothek arbeiten, so bin ich mit CRITICAL_SECTION von VS2010 Beta boost :: mutex arbeitet zu groß und die RAH Muster eine lock_guard der Verwendung ist fast notwendig, unabhängig davon, wie Sie sich entscheiden, dies zu tun:

template <class T>
class synchronized_set
{
    //boost::mutex is good here too
    critical_section cs;
public:
    typedef set<T> std_set_type;
    set<T> unsafe_set;
    bool try_insert(...)
    {
        //boost has a lock_guard
        lock_guard<critical_section> guard(cs);
    }
};

Andere Tipps

Warum nicht nur eine gemeinsame Mutex verwenden, um den gleichzeitigen Zugriff zu schützen? Achten Sie darauf, RAII verwenden zu sperren und entsperren den Mutex:

{
   Mutex::Lock lock(mutex);
   // std::set manipulation goes here
}

Dabei gilt Mutex :: Lock ist eine Klasse, die den Mutex im Konstruktor sperrt und entsperrt es in der destructor und Mutex ist ein Mutex-Objekt, das von allen Threads gemeinsam genutzt wird. Mutex ist nur ein Wrapper-Klasse, die unabhängig von spezifischen OS primitive verbirgt Sie verwenden.

Ich habe immer gedacht, dass die Parallelität und setzte Verhalten orthogonale Konzepte sind, so ist es besser, sie in getrennten Klassen zu haben. In meinen Erfahrungen, die Klassen versuchen, Thread-sicher selbst sind, dass sie nicht sehr flexibel oder alles, was nützlich.

Sie wollen nicht, interne Verriegelung, wie Ihre Invarianten oft mehrere Operationen auf der Datenstruktur benötigen, und interne Verriegelung verhindert, dass nur die Schritte zur gleichen Zeit geschehen, während Sie die Schritte aus verschiedenen Makro-Operationen halten, müssen aus Verschachtelung.

Sie können auch einen Blick auf ACE-Bibliothek nehmen, die alle Thread-sicher-Container hat man jemals brauchen könnte.

Alles, was ich denken kann, ist OpenMP zu verwenden für Parallelisierung, leitet eine Menge Klasse von sexuell übertragbaren Krankheiten und legt eine Schale um jeden critial Satz Vorgang, dass der Betrieb kritisch erklärt mit #pragma kritischen omp.

Qt QSet Klasse implizites Sharing verwendet (Copy on Write-Semantik) und ähnliche Verfahren mit std :: set, wird seine Umsetzung aussehen kann, Qt ist lgpl.

Thread-Sicherheit und kopieren Sie auf Schreib Semantik ist nicht das Gleiche. Dass gesagt wird ...

Wenn Sie wirklich nach Copy-on-Write-Semantik der Adobe-Source-Bibliotheken hat ein copy_on_write Vorlage, die diese Semantik, was auch immer fügt man instanziiert es mit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top