2010-04-22 15 views
7

Laut an article auf IBM.com ist eine Race Condition eine Situation, in der zwei oder mehr Threads oder Prozesse gemeinsame Daten lesen oder schreiben und das Endergebnis vom Timing der geplanten Threads abhängt kann zu unvorhersehbaren Ergebnissen und subtilen Programmfehlern führen. " . Obwohl der Artikel Java betrifft, wurde mir im Allgemeinen die gleiche Definition beigebracht.Was ist mit Race Condition in Multithreading lesen?

Soweit ich weiß, besteht die einfache Funktion des Lesens aus dem RAM darin, die Zustände bestimmter Eingangsleitungen (Adresse, Lesen usw.) einzustellen und die Zustände der Ausgangsleitungen zu lesen. Dies ist eine Operation, die offensichtlich nicht gleichzeitig von zwei Geräten ausgeführt werden kann und serialisiert werden muss.

Jetzt nehmen wir an, wir haben eine Situation, wenn ein paar Threads auf ein Objekt im Speicher zugreifen. Theoretisch sollte dieser Zugang serialisiert werden, um Rennbedingungen zu vermeiden. Aber z.B. Der Leser/Schreiber-Algorithmus geht davon aus, dass eine beliebige Anzahl von Lesern den gemeinsamen Speicher gleichzeitig nutzen kann.

Die Frage ist also: Muss man eine exklusive Sperre für das Lesen implementieren, wenn Multithreading (in WinAPI beispielsweise) verwendet wird? Wenn nicht, warum? Wo ist diese Kontrolle implementiert - Betriebssystem, Hardware?

Mit freundlichen Grüßen, Kuba

+0

hah, erzählt'ya;] –

Antwort

6

auf Hardware-Ebene Lesespeicher werden sequentiell durchgeführt - Sie müssen nicht auf dieser Ebene über die Parallelität kümmern. Zwei Threads geben Leseanweisungen aus und alle notwendigen Dinge - Einstellungsadressen auf dem Adressbus und tatsächliche Lesevorgänge werden von der Speicherzugriffshardware so implementiert, dass Lesevorgänge immer richtig funktionieren.

In der Tat gilt das Gleiche für Lese-/Schreib-Szenarien mit der Ausnahme, dass wenn Lese- und Schreibanforderungen interleaved sind, Sie je nach Timing unterschiedliche Ergebnisse erhalten, weshalb Sie eine Synchronisation benötigen.

0

Es gibt keine einfache Antwort auf diese Frage. Verschiedene APIs (und verschiedene Umgebungen) haben unterschiedliche Ebenen von Multithread-Awareness und Multithread-Sicherheit.

2

Solange nichts die Daten ändert, ist es sicher, sie aus mehreren Threads zu lesen. Selbst wenn zwei CPUs (oder Kerne) versuchen, auf den Speicher zum Lesen mit genau demselben Taktzyklus zuzugreifen, werden ihre Zugriffe durch den Speichercontroller serialisiert, und sie werden sich nicht gegenseitig stören. Diese Funktion ist wichtig, damit die Hardware richtig funktioniert.

Verwandte Themen