Kann jemand bitte einfach erklären, was Thread-Konflikt ist?
Ich habe es gegoogelt, kann aber keine einfache Erklärung finden.
multithreading
language-agnostic
Tony der Löwe
quelle
quelle
Antworten:
Im Wesentlichen ist ein Thread-Konflikt eine Bedingung, bei der ein Thread auf eine Sperre / ein Objekt wartet, die bzw. das derzeit von einem anderen Thread gehalten wird. Daher kann dieser wartende Thread dieses Objekt erst verwenden, wenn der andere Thread dieses bestimmte Objekt entsperrt hat.
quelle
Einige Antworten scheinen sich auf Sperrenkonflikte zu konzentrieren, aber Sperren sind nicht die einzigen Ressourcen, auf denen Konflikte auftreten können. Konflikt ist einfach, wenn zwei Threads versuchen, entweder auf dieselbe Ressource oder auf verwandte Ressourcen so zuzugreifen, dass mindestens einer der konkurrierenden Threads langsamer ausgeführt wird als wenn die anderen Threads nicht ausgeführt würden.
Das offensichtlichste Beispiel für einen Konflikt ist ein Schloss. Wenn Thread A eine Sperre hat und Thread B dieselbe Sperre erlangen möchte, muss Thread B warten, bis Thread A die Sperre aufhebt.
Dies ist plattformspezifisch, aber der Thread kann langsamer werden, selbst wenn er nie warten muss, bis der andere Thread die Sperre aufhebt! Dies liegt daran, dass eine Sperre irgendeine Art von Daten schützt und die Daten selbst häufig auch umstritten sind.
Stellen Sie sich beispielsweise einen Thread vor, der eine Sperre erwirbt, ein Objekt ändert, dann die Sperre aufhebt und einige andere Aufgaben ausführt. Wenn zwei Threads dies tun, selbst wenn sie nie um die Sperre kämpfen, laufen die Threads möglicherweise viel langsamer als wenn nur ein Thread ausgeführt würde.
Warum? Angenommen, jeder Thread läuft auf einem eigenen Kern auf einer modernen x86-CPU und die Kerne teilen sich keinen L2-Cache. Mit nur einem Thread bleibt das Objekt möglicherweise die meiste Zeit im L2-Cache. Wenn beide Threads ausgeführt werden, stellt der andere Thread jedes Mal, wenn ein Thread das Objekt ändert, fest, dass sich die Daten nicht in seinem L2-Cache befinden, da die andere CPU die Cache-Zeile ungültig gemacht hat. Auf einem Pentium D führt dies beispielsweise dazu, dass der Code mit einer FSB-Geschwindigkeit ausgeführt wird, die viel geringer ist als die L2-Cache-Geschwindigkeit.
Da Konflikte auftreten können, auch wenn die Sperre selbst nicht angefochten wird, können Konflikte auch auftreten, wenn keine Sperre vorhanden ist. Angenommen, Ihre CPU unterstützt ein atomares Inkrement einer 32-Bit-Variablen. Wenn ein Thread eine Variable weiter inkrementiert und dekrementiert, ist die Variable die meiste Zeit im Cache heiß. Wenn zwei Threads dies tun, kämpfen ihre Caches um den Besitz des Speichers, der diese Variable enthält, und viele Zugriffe sind langsamer, wenn das Cache-Kohärenzprotokoll arbeitet, um jeden Kernbesitz der Cache-Zeile zu sichern.
Ironischerweise reduzieren Sperren normalerweise Konflikte. Warum? Denn ohne eine Sperre könnten zwei Threads dasselbe Objekt oder dieselbe Sammlung bearbeiten und viele Konflikte verursachen (z. B. gibt es Warteschlangen ohne Sperren). Sperren neigen dazu, konkurrierende Threads zu deaktivieren, sodass nicht konkurrierende Threads stattdessen ausgeführt werden können. Wenn Thread A eine Sperre enthält und Thread B dieselbe Sperre wünscht, kann die Implementierung stattdessen Thread C ausführen. Wenn Thread C diese Sperre nicht benötigt, können zukünftige Konflikte zwischen Thread A und B für eine Weile vermieden werden. (Dies setzt natürlich voraus, dass andere Threads ausgeführt werden könnten. Es hilft nicht, wenn das System als Ganzes nur dann nützliche Fortschritte erzielen kann, wenn konkurrierende Threads ausgeführt werden.)
quelle
Von hier aus :
quelle
Ich denke, es sollte eine Klarstellung des OP zum Hintergrund der Frage geben - ich kann mir 2 Antworten vorstellen (obwohl ich sicher bin, dass es Ergänzungen zu dieser Liste gibt):
Wenn Sie sich auf das allgemeine "Konzept" von Thread-Konflikten beziehen und wie es sich in einer Anwendung präsentieren kann, verweise ich auf die ausführliche Antwort von @ DavidSchwartz oben.
Es gibt auch den Leistungsindikator ".NET CLR-Sperren und -Threads: Gesamtzahl der Inhalte". Wie aus der PerfMon-Beschreibung für diesen Zähler hervorgeht, ist er definiert als:
... und ich bin sicher, andere für andere Betriebssysteme und Anwendungs-Frameworks.
quelle
Du hast 2 Threads. Thread A und Thread B, Sie haben auch Objekt C.
A greift derzeit auf Objekt C zu und hat dieses Objekt gesperrt. B muss auf Objekt C zugreifen, kann dies jedoch erst tun, wenn A die Sperre für Objekt C aufhebt.
quelle
Ein anderes Wort könnte Parallelität sein. Es ist einfach die Idee, dass zwei oder mehr Threads versuchen, dieselbe Ressource zu verwenden.
quelle
Für mich ist der Wettbewerb ein Wettbewerb zwischen zwei oder mehr Threads um eine gemeinsam genutzte Ressource. Ressource kann ein Schloss, ein Zähler usw. sein. Wettbewerb bedeutet "wer bekommt es zuerst". Je mehr Threads, desto mehr Streit. Je häufiger auf eine Ressource zugegriffen wird, desto mehr Konflikte treten auf.
quelle
Wie im Beispiel geben die beiden Fälle die Bedeutung von Rivalität an.
quelle
Thread-Konflikte werden auch durch E / A-Vorgänge beeinflusst. Beispiel: Wenn ein Thread, der auf das Lesen einer Datei wartet, als Konflikt betrachtet werden kann. Verwenden Sie E / A-Abschlussports als Lösung.
quelle
aus der dotTrace-Dokumentation
quelle