Heim  >  Artikel  >  Betrieb und Instandhaltung  >  So lösen Sie das Problem des Linux-Multithreadings und des gleichzeitigen Multithread-Zugriffs auf denselben Speicher

So lösen Sie das Problem des Linux-Multithreadings und des gleichzeitigen Multithread-Zugriffs auf denselben Speicher

WBOY
WBOYnach vorne
2023-05-17 17:26:232086Durchsuche

Warum brauchen Sie Multithreading?

  • Die Fähigkeit paralleler Entitäten, denselben Adressraum und alle verfügbaren Daten gemeinsam zu nutzen, kann nicht durch Multiprozesssperren ausgedrückt werden, da mehrere Prozesse unterschiedliche Adressräume haben;#🎜 🎜#

  • Threads sind leichter und schneller als Prozesse;

    # 🎜🎜#Vorteile von Multithreading
  • Beschleunigen Sie die Programmreaktion;
  • Wenn keine Aufgaben vorhanden sind verarbeitet werden muss, kann die Prozessorzeit anderen Aufgaben zugewiesen werden. 🎜🎜#

kann Aufgaben jederzeit stoppen;

  • Die Priorität jeder Aufgabe kann separat eingestellt werden, um die Leistung zu optimieren ; Oder Aufgaben, die eine große Anzahl von Prozessoren beanspruchen, blockieren Benutzeroberflächenoperationen; 🎜##🎜🎜 #

  • Nachteile von Multithreading
  • Das Warten auf gemeinsam genutzte Ressourcen verlangsamt die Ausführungsgeschwindigkeit des Programms. Diese Gemeinsam genutzte Ressourcen sind hauptsächlich exklusive Ressourcen #
  • Das gleichzeitige Lesen oder Schreiben öffentlicher Variablen führt oft zu unvorhersehbaren Fehlern
  • Überprüfungsideen
  • Verwenden Sie fünf Thread-Funktionen, um ++-Operationen für dieselbe globale Variable auszuführen (Anfangswert ist 0), jede Thread-Funktion ++ 1000-mal, also sollten unsere 5 Threads ++5000-mal sein und der Endwert der globalen Variablen sollte sein 5000.

Führte verschiedene Versuche durch und stellte fest, dass der wg-Wert manchmal 5000, manchmal 4997 oder 4998 betrug.

  • Der Grund ist:

  • Wir verwenden wg++, was keine atomare Operation ist, sondern in Anweisungen umgewandelt wird. Es besteht aus mehreren Anweisungen und ist eine vom Computer ausgeführte Binäranweisung, die in viele Schritte unterteilt ist. Beispielsweise gibt es zwei Threads für wg++
  • , die jedoch nicht gleichzeitig ausgeführt werden können Lesen Sie den Wert, dann ++ und lesen Sie ihn dann zurück. Dieser Vorgang ist noch nicht abgeschlossen. Ein anderer Thread liest auch wg, ++ und liest ihn dann zurück. Es ist möglich, dass zwei Threads wg=1; hinzufügen, aber der Endwert ist 2.

  • Wir können das Problem nicht nur auf Codeebene betrachten, sondern müssen auch die Umgebung berücksichtigen, in der der Code ausgeführt wird. Bei der Beobachtung der Einstellungen unserer virtuellen Maschine haben wir festgestellt, dass es 4 Prozessoren gibt. Wenn mindestens zwei Prozessoren in der Lage sind, andere Aufgaben zu verarbeiten, gibt es eine Situation, in der ein Thread auf zwei Prozessoren platziert wird und bei gleichzeitigem Zugriff die Wahrscheinlichkeit von weniger als 5000 relativ hoch ist parallele Ausführung.

  • Nachdem nur ein Thread aktiviert wurde, wird nur ein Thread ausgeführt, und die anderen vier Threads werden definitiv nicht ausgeführt. Es gibt keine Situation, in der zwei Threads ausgeführt werden gleichzeitig ausgeführt.

    Die Wahrscheinlichkeit, weniger als 5000 zu erscheinen, ist sehr gering (der Grund dafür ist, dass nach dem Lesen des Val-Werts 1 keine Zeit zum Zurückkehren bleibt. Zu diesem Zeitpunkt ist die Zeitscheibe angekommen. und es ist ein Wechsel zu anderen Threads aufgetreten und es ist immer noch 1, hinzufügen und hinzufügen und vor Ort wiederherstellen, es ist immer noch 1 zum Hinzufügen und Hinzufügen. Die Wahrscheinlichkeit, dass dieses Szenario auftritt, ist sehr gering.) Ein Prozessor kann nicht parallelisiert werden .

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem des Linux-Multithreadings und des gleichzeitigen Multithread-Zugriffs auf denselben Speicher. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen