2017-03-29 3 views
1

ich auf Memory Model Bjarnes FAQ lese, hier ist ein ZitatWarum gibt es kein Datenrennen?

So, 11 Garantien C++, dass keine derartigen Probleme für „getrennte Speicherstellen auftreten‚‘Genauer gesagt:. Ein Speicherplatz nicht sicher zugegriffen werden kann durch zwei Threads ohne irgendeine Art von Locking, es sei denn, sie sind beide Lesezugriffe. Beachten Sie, dass verschiedene Bitfelder innerhalb eines einzelnen Worts keine separaten Speicherorte sind, teilen Sie also keine Structs mit Bitfeldern unter Threads ohne irgendeine Form von Locking. Das C++ - Speichermodell ist einfach "wie jeder erwarten würde."

Es ist jedoch nicht immer einfach, über Nebenläufigkeitsprobleme auf niedriger Ebene nachzudenken. Betrachten:

Start mit x == 0 und y == 0

if (x) y = 1; // Thread 1

if (y) x = 1; // Thema 2

Gibt es hier ein Problem? Genauer gesagt, gibt es ein Datenrennen? (Nein, ist es nicht).

Meine Frage ist, warum gibt es kein Datenrennen? Es ist für mich offensichtlich, dass es anscheinend einen Datenrennen gibt, da Thread 1 ein Schreiber für y ist, während Thread 2 ein Leser für y ist, und ebenso für x.

+0

beginnend mit (0,0) ist der Schlüsselpunkt hier –

Antwort

3

x und y sind 0 und damit der Code hinter dem if wird nicht ausgeführt, und es wird kein Schreib sein und deshalb kann es keine Daten Rennen.

+0

Also was ist der Sinn von Bjarne Beispiel? Sieht für mich ziemlich trivial aus, aber er schreibt es, als ob es ein verstecktes Problem gäbe ... – zett42

+0

@ zett42 Ich musste es 10 mal lesen, bevor ich es bekam und das OP musste auf SO fragen, um es zu bekommen. Der Punkt ist, dass selbst dieses extrem einfache Beispiel die Leute verwirren kann. Vielleicht war es nur ein bisschen zu einfach, um Sie zu verwirren, aber der allgemeine Punkt, dass die Argumentation über Thread-Sicherheit schwierig ist, steht immer noch. – nwp

+0

Es verwirrte mich nur, weil er schrieb: "Es ist nicht immer leicht, klar zu denken" ;-) – zett42

2

Der kritische Punkt ist:

Start mit x==0 und y==0

Da beide Variablen auf 0 gesetzt werden, wenn es beginnt, die if Tests fehlschlagen, und Zuweisungen wird nie auftreten. Daher lesen beide Threads nur die Variablen und schreiben sie niemals.

Verwandte Themen