Wie sblundy wies darauf hin, wenn alle Objekte sind unveränderlich, schreibgeschützt, Sie müssen nicht jedoch über Sperren, sich Sorgen zu machen, das heißt, Sie muss möglicherweise Objekte viel kopieren. Das Kopieren beinhaltet normalerweise malloc und malloc verwendet Sperren, um Speicherzuteilungen über Threads zu synchronisieren, so dass unveränderliche Objekte Sie weniger kaufen als Sie denken (malloc selbst skaliert eher schlecht und malloc ist langsam; wenn Sie eine Menge malloc in einem leistungskritischen Abschnitt , erwarte keine gute Leistung).
Wenn Sie nur einfache Variablen aktualisieren müssen (zB 32 oder 64 Bit int oder Zeiger), führen Sie einfach Additions- oder Subtraktionsoperationen durch oder tauschen Sie einfach die Werte von zwei Variablen aus. Die meisten Plattformen bieten dafür "atomare Operationen" (weitere GCC bietet diese auch an). Atomic ist nicht dasselbe wie thread-safe.Unteilbar stellt jedoch sicher, dass, wenn ein Thread beispielsweise einen 64-Bit-Wert an einen Speicherort schreibt und ein anderer Thread daraus liest, der Lesevorgang entweder den Wert vor der Schreiboperation oder nach der Schreiboperation erhält, aber niemals eine unterbrochen wird Wert zwischen der Schreiboperation (zB eine, bei der die ersten 32 Bit bereits neu sind, die letzten 32 Bit immer noch der alte Wert! Dies kann vorkommen, wenn Sie keinen atomaren Zugriff auf eine solche Variable verwenden).
Wenn Sie jedoch eine C-Struktur mit drei Werten haben, die aktualisiert werden sollen, selbst wenn Sie alle drei mit atomaren Operationen aktualisieren, handelt es sich um drei unabhängige Operationen. Daher könnte ein Leser die Struktur mit einem Wert bereits aktualisieren und zwei werden nicht aktualisiert. Hier benötigen Sie eine Sperre, wenn Sie sicherstellen müssen, dass der Leser entweder alle Werte in der Struktur als alte oder als neue Werte erkennt.
Eine Möglichkeit, Schlösser viel besser skalieren zu können, sind R/W-Sperren. In vielen Fällen sind Aktualisierungen von Daten eher selten (Schreiboperationen), aber der Zugriff auf die Daten ist sehr häufig (Lesen der Daten), denken Sie an Sammlungen (Hashtabellen, Bäume). In diesem Fall werden Ihnen R/W-Sperren einen enormen Leistungsgewinn bringen, da viele Threads gleichzeitig eine Lesesperre halten können (sie blockieren sich gegenseitig nicht) und nur wenn ein Thread eine Schreibsperre wünscht, alle anderen Threads sind für die Zeit gesperrt, in der das Update durchgeführt wird.
Der beste Weg zur Vermeidung von Thread-Problemen ist, keine Daten über Threads hinweg zu teilen. Wenn jeder Thread die meiste Zeit mit Daten beschäftigt, auf die kein anderer Thread zugreifen kann, brauchen Sie diese Daten überhaupt nicht zu sperren (auch keine atomaren Operationen). Versuchen Sie also, so wenig Daten wie möglich zwischen Threads freizugeben. Dann brauchen Sie nur einen schnellen Weg, um Daten zwischen Threads zu verschieben, wenn Sie wirklich müssen (ITC, Inter Thread Communication). Abhängig von Ihrem Betriebssystem, Ihrer Plattform und Programmiersprache (leider haben Sie uns keine von beiden gesagt), könnten verschiedene leistungsfähige Methoden für ITC existieren.
Und schließlich, ein weiterer Trick mit geteilten Daten zu arbeiten, aber ohne Sperren ist sicherzustellen, dass Threads nicht auf die gleichen Teile der freigegebenen Daten zugreifen. Z.B. Wenn sich zwei Threads ein Array teilen, aber eines immer nur auf even zugreifen wird, das andere nur ungerade Indizes, dann brauchen Sie kein Locking. Oder wenn sich beide den gleichen Speicherblock teilen und einer nur die obere Hälfte benutzt, der andere nur den unteren, braucht man keine Sperre. Es wird zwar nicht gesagt, dass dies zu einer guten Leistung führen wird; vor allem nicht bei Multi-Core-CPUs. Das Schreiben von Operationen eines Threads in diese gemeinsam genutzten Daten (das Ausführen eines Kerns) kann dazu führen, dass der Cache für einen anderen Thread (auf einem anderen Kern) geleert wird. Diese Cache-Flushes sind häufig der Engpass für Multithread-Anwendungen, die auf modernen Mehrkern-CPUs ausgeführt werden.
Ich denke, Sie bedeuten Gewindesichere verriegelungsfreie Struktur. –
Welche Sprache benutzen Sie? –