Dies handelt von Leistungen - aber auch von der Fähigkeit, Mehrfadenlasten zu bewältigen:
-
Sperren gewähren einen exklusiven Zugriff auf einen Teil des Codes: Während ein Faden eine Sperre hat, werden andere Fäden gedreht (Schleife, während sie versuchen, die Sperre zu erwerben) oder blockiert, schlafen, bis die Sperre freigegeben wird (was normalerweise passiert, wenn das Drehen zu lange dauert);
-
Atomare Operationen gewähren einen exklusiven Zugriff auf eine Ressource (normalerweise eine wortgroße Variable oder einen Zeiger), indem sie nicht unterbrechbare intrinsische CPU-Anweisungen verwenden.
Da Sperren die Ausführung anderer Fäden BLOCKIEREN, wird ein Programm verlangsamt. Da atomare Operationen seriell ausgeführt werden (nacheinander), gibt es kein Blockieren*.
(*) solange die Anzahl der gleichzeitigen CPUs, die versuchen, auf die gleiche Ressource zuzugreifen, keine Engpässe verursacht - aber bisher haben wir nicht genügend CPU-Kerne, um dies als Problem zu betrachten.
Ich habe daran gearbeitet, einen Wartefreien (Sperrfreien ohne Wartezeiten) Schlüssel-Wert-Speicher für den Server zu schreiben, an dem ich arbeite.
Bibliotheken wie Tokyo Cabinet (auch TC-FIXED, ein einfaches Array) verlassen sich auf Sperren, um die Integrität einer Datenbank zu bewahren:
"Während ein schreibender Faden die Datenbank bedient, sind andere lesende Fäden und schreibende Fäden blockiert" (Tokyo Cabinet Dokumentation)
Die Ergebnisse eines Tests ohne Nebenläufigkeit (ein Ein-Faden-Test):
SQLite Zeit: 56,4 ms (ein B-Baum)
TC Zeit: 10,7 ms (eine Hashtabelle)
TC-FIXED Zeit: 1,3 ms (ein Array)
G-WAN KV Zeit: 0,4 ms (etwas Neues, das funktioniert, aber ich bin mir nicht sicher, ob ein Name benötigt wird)
Mit Nebenläufigkeit (mehrere Fäden schreiben und lesen in derselben DB) überlebte nur der G-WAN KV denselben Test, weil (im Gegensatz zu den anderen) er niemals blockiert.
Also, ja, dieser KV-Speicher macht es Entwicklern leichter, ihn zu verwenden, da sie sich nicht um Fadenprobleme kümmern müssen. Es war jedoch nicht trivial, es so zum Laufen zu bringen.