2016-05-26 9 views
1

Was sollte ich in Bezug auf Thread-Sicherheit und undefiniertes Verhalten beachten, wenn mehrere Threads von einer einzigen Quelle lesen, die konstant ist?Threadsicherheit: Mehrere Threads, die von einer einzelnen const-Quelle lesen

Ich arbeite an einem Signalverarbeitungsmodell, das parallele Ausführung von unabhängigen Prozessen ermöglicht, diese Prozesse können einen Eingangspuffer teilen, aber der Prozess, der den Eingangspuffer füllt, wird immer abgeschlossen sein, bevor die nächste Stufe von möglicherweise parallelen Prozessen ausführen.

Muss ich mich in dieser Situation um Threadsicherheitsprobleme kümmern? und was könnte ich dagegen tun?

möchte ich zu anmerken, dass eine Sperre freie Lösung wäre am besten, wenn möglich

+1

Für C++ 11 bedeutet 'const' threadsicher und die Standardbibliothek funktioniert so. Für benutzerdefinierte Typen sollten sie genauso funktionieren, aber dafür müssen sie ordnungsgemäß implementiert werden. Ich werde versuchen, die Standardreferenz zu finden. –

Antwort

2

aber der Prozess, der Eingangspuffer vollständig füllt wird immer, bevor die nächste Stufe der möglicherweise parallele Prozesse

ausführt Wenn dies dann gibt es garantiert kein Problem mit mehreren von verschiedenen Threads liest für konstante Objekte.

Ich habe den offiziellen Standard nicht, so dass die folgenden von n4296 ist:

17.6.5.9 Daten Rennen Vermeidung

A C++ Funktion Standardbibliothek wird nicht direkt oder indirekt Ändern von Objekten (1.10), auf die durch Threads anders als der aktuelle Thread zugegriffen werden kann, es sei denn, auf die Objekte wird direkt oder indirekt über die nichtkonstanten Argumente der Funktion zugegriffen, einschließlich dieser.

[Anmerkung: Das bedeutet zum Beispiel, dass Implementierungen kein statisches Objekt für interne Zwecke ohne Synchronisation verwenden können, weil sie ein Daten Rennen auch in Programmen die dazu führen könnten, die nicht explizit Objekte zwischen Threads gemeinsam nutzen . -Ende note]


Hier ist die Herb Sutter video, wo ich zum ersten Mal über die Bedeutung von const in dem C++ 11-Standard gelernt. (siehe ca. 7:00 bis 10:30)

1

Nein, Sie sind OK. Mehrfache Lesevorgänge von der gleichen konstanten Quelle sind OK und stellen kein Risiko in allen Threadingmodellen dar, die ich kenne (nämlich Posix und Windows).

jedoch

aber der Prozess, der Eingangspuffer vollständig ist immer

Was die Garantien sind hier füllt? Woher weißt du das wirklich? Hast du eine Synchronisation?

+0

Die Prozesskette wird in mehrere Stufen unterteilt.Die Stufen werden so ausgeführt, dass das System als single threaded dargestellt wird. Die parallele Verarbeitung wird nur innerhalb der Stufen erlaubt sein, und das System wird warten, bis jede Stufe abgeschlossen ist, bevor eine andere Stufe, die von der aktuellen Stufe abhängt, ausgeführt wird. –

+0

@AlexZywicki, Teufel steckt im Detail. System wird warten - auf ** was **? – SergeyA

+0

Das ist in der Tat die Frage, ich nehme an, dass dies im Moment das gewünschte Verhalten ist, das ich erreichen will. Ich debattierte mit einem std :: future/promise oder mit std :: atomic_bool mit einer Bedingungsvariablen. Ich spiele immer noch mit Designideen herum –

Verwandte Themen