C ++ pthread, zwei Threads lesen eine globale Variable

8

Wenn es zwei Threads gibt, die nur eine globale Variable lesen, ist es notwendig, Mutex zu verwenden, um die globale Variable zu sperren und zu entsperren?

    
Kelvin Tan 13.10.2013, 10:33
quelle

4 Antworten

5

Wenn die Threads nur die Variable lesen und niemand darauf schreibt (nicht einer der Threads, nicht jemand anderes), dann sind Sie ohne Sperren vollkommen in Ordnung. Wenn eine gleichzeitige Änderung passieren könnte, dann müssen alle (einschließlich reiner Leser) irgendwie synchronisiert werden - durch einen Mutex, eine Lese- / Schreibsperre oder auf andere Weise.

    
Angew 13.10.2013 11:10
quelle
3

Im Allgemeinen ist ein exklusiver Zugriff erforderlich, um zu verhindern, dass ein inkonsistenter Status angezeigt wird . Für einen Leser-Thread bedeutet das, partielle Lesevorgänge zu vermeiden .

Was heißt das? Stellen Sie sich vor, Sie haben einen Wert, der auf zwei (atomaren) Ganzzahlen gespeichert ist, z. B. Koordinaten.

%Vor%

Nun lesen wir i und j , während sie modifiziert werden, genauer gesagt, wenn sich ein Writer -Thread diagonal von (3, 4) nach (4, 5) bewegen möchte:

%Vor%

Dies wird als partielles Lesen bezeichnet: Der Reader -Thread hat Informationen erhalten, dass das Objekt (4, 4) ist, obwohl es nie dort war . Ich werde Sie denken lassen, was passiert, wenn diese Koordinaten verwendet werden, um die Flugbahn eines Flugzeugs zu berechnen ...

Das Vermeiden partieller Lesevorgänge ist jedoch ziemlich einfach: Mutationen sollten atomar gesehen werden.

  • Wenn es keine Mutation gibt (für die Dauer der Lesevorgänge), können Sie einfach
  • lesen
  • Wenn es Mutationen gibt, brauchen Sie einen Mechanismus zum gegenseitigen Ausschluss (wie zum Beispiel einen Reader / Writer-Mutex)

Um Ihre Frage zu beantworten, ist die no-Synchronisation erforderlich, wenn die Lesezugriffe die einzigen Zugriffe sind. Aber wenn Sie manchmal (auch selten) die gelesenen Informationen ändern, dann brauchen Sie einen Mechanismus.

    
Matthieu M. 13.10.2013 11:21
quelle
2
___ qstnhdr ___ C ++ pthread, zwei Threads lesen eine globale Variable ___ answer19344618 ___

Im Allgemeinen ist ein exklusiver Zugriff erforderlich, um zu verhindern, dass ein inkonsistenter Status angezeigt wird . Für einen Leser-Thread bedeutet das, partielle Lesevorgänge zu vermeiden .

Was heißt das? Stellen Sie sich vor, Sie haben einen Wert, der auf zwei (atomaren) Ganzzahlen gespeichert ist, z. B. Koordinaten.

%Vor%

Nun lesen wir %code% und %code% , während sie modifiziert werden, genauer gesagt, wenn sich ein %code% -Thread diagonal von %code% nach %code% bewegen möchte:

%Vor%

Dies wird als partielles Lesen bezeichnet: Der %code% -Thread hat Informationen erhalten, dass das Objekt %code% ist, obwohl es nie dort war . Ich werde Sie denken lassen, was passiert, wenn diese Koordinaten verwendet werden, um die Flugbahn eines Flugzeugs zu berechnen ...

Das Vermeiden partieller Lesevorgänge ist jedoch ziemlich einfach: Mutationen sollten atomar gesehen werden.

  • Wenn es keine Mutation gibt (für die Dauer der Lesevorgänge), können Sie einfach
  • lesen
  • Wenn es Mutationen gibt, brauchen Sie einen Mechanismus zum gegenseitigen Ausschluss (wie zum Beispiel einen Reader / Writer-Mutex)

Um Ihre Frage zu beantworten, ist die no-Synchronisation erforderlich, wenn die Lesezugriffe die einzigen Zugriffe sind. Aber wenn Sie manchmal (auch selten) die gelesenen Informationen ändern, dann brauchen Sie einen Mechanismus.

    
___ antwort19344229 ___

Wenn sie nur lesen, brauchen Sie nicht zu sperren.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123mutex ___ Ein Mutex ("wechselseitiger Ausschluss") ist ein Mechanismus zur Sicherstellung der Integrität, wenn auf dieselben Daten oder dieselbe Ressource gleichzeitig von mehreren Threads zugegriffen (insbesondere geändert) wird. ___ qstntxt ___

Wenn es zwei Threads gibt, die nur eine globale Variable lesen, ist es notwendig, Mutex zu verwenden, um die globale Variable zu sperren und zu entsperren?

    
___ tag123pthreads ___ PThreads (POSIX-Threads) ist eine standardisierte C-basierte API zum Erstellen und Bearbeiten von Threads. Es wird derzeit von POSIX.1-2008 definiert (IEEE Std 1003.1, Ausgabe 2013 / Die Open Group Base Specifications Ausgabe 7). ___ answer19344246 ___

Wenn sie nur lesen, dann brauchen sie keine Sperre, aber wenn das nicht der Fall ist, dann denke ich, dass mutex sicherstellen wird, dass der Lese-Thread keine Ressourcen verbraucht, während er nichts zu tun hat.

So etwas wie: -

%Vor%

Gleiches gilt für %code%

Nebenbei bemerkt: -

Mutex wird im Allgemeinen verwendet, um zu verhindern, dass mehrere Threads gleichzeitig auf gemeinsam genutzten Speicher oder andere Ressourcen zugreifen. Auch daran zu erinnern, dass es nichts selbst sperrt

    
___ answer19344514 ___

Wenn die Threads nur die Variable lesen und niemand darauf schreibt (nicht einer der Threads, nicht jemand anderes), dann sind Sie ohne Sperren vollkommen in Ordnung. Wenn eine gleichzeitige Änderung passieren könnte, dann müssen alle (einschließlich reiner Leser) irgendwie synchronisiert werden - durch einen Mutex, eine Lese- / Schreibsperre oder auf andere Weise.

    
___
thebjorn 13.10.2013 10:39
quelle
2

Wenn sie nur lesen, dann brauchen sie keine Sperre, aber wenn das nicht der Fall ist, dann denke ich, dass mutex sicherstellen wird, dass der Lese-Thread keine Ressourcen verbraucht, während er nichts zu tun hat.

So etwas wie: -

%Vor%

Gleiches gilt für Thread2

Nebenbei bemerkt: -

Mutex wird im Allgemeinen verwendet, um zu verhindern, dass mehrere Threads gleichzeitig auf gemeinsam genutzten Speicher oder andere Ressourcen zugreifen. Auch daran zu erinnern, dass es nichts selbst sperrt

    
Rahul Tripathi 13.10.2013 10:40
quelle

Tags und Links