2016-06-29 19 views
0

Ich versuche, Race-Bedingungen in meinem Code zu vermeiden, und ich arbeite derzeit mit einer einzelnen Hyperthread-CPU, so gibt es zwei logische CPUs, jede mit ihrem eigenen Thread. Wenn mein Verständnis von Hyperthreading korrekt ist, teilen diese Threads die gleichen Ressourcen, aber ihre Aktionen sind tatsächlich zeitaufgelöst, nicht gleichzeitig. Ist es immer noch möglich, dass sich zwischen diesen beiden Hyperthreads Race Conditions ergeben?Kann es ein Rennen zwischen zwei Hyperthreads auf der gleichen CPU geben?

Zum Beispiel gibt es Grund für mich, dies zu ändern:

Connection& connection = connections[num_connections]; 
... do some stuff 
++num_connections; 

dazu:

Connection& connection = connections[num_connections++]; 
... do some stuff 
+1

a) Die Unterscheidung zwischen Hyperthreading und Threading ist durch die Threading-Umgebung verborgen. b) Kein Code-Konstrukt ist Thread-sicher. Du wirst so mehr Forschung brauchen. –

+1

Time Slicing ist alles was für Rennen benötigt wird. Es gibt kein mögliches Rennen, das nicht mit der Zeit reproduziert werden kann, die auf einer unicore CPU schneidet. – usr

+1

@usr Nicht von der Frage selbst abzulenken, aber trifft das auf Systeme mit einem entspannten Speichermodell zu? Ich würde denken, dass das Timeclicing eines Unicore nur die sequentielle Konsistenz eines Multicore-Systems emulieren kann. Ich sehe nicht, wie es Race-Bedingungen nachbilden kann, die nur durch Speicher-Neuordnung verursacht werden können. Zurück zur Frage, ich weiß nicht, ob Intel etwas über Speicher-Neuordnung zwischen Hyperthreads auf dem gleichen Kern sagt. Aber klar muss der Programmierer den schlimmsten Fall annehmen. – Mysticial

Antwort

1

Es ist möglich.

Wenn beide Threads eine Logik wie

if(condition){ 
donate1MillionDollars 
condition=false 
} 

auch mit Time Slicing ausführen, können die zwei Threads geben die if-Block, und Sie werden viel schlechter als erwartet :)

Ohne zu wissen, was " etwas tun "bedeutet, dass es schwer ist, speziell für Ihren Anwendungsfall zu antworten.

1

Da Sie die Reihenfolge der Ereignisse zwischen Threads nicht steuern können, oder wenn ein Thread ausgeschlossen wird, können natürlich Race Conditions Fehler verursachen.

Durch Race Condition generierte Fehler erfordern keine gleichzeitige Ausführung.