Welche von Linux unterstützten Operationen sind atomar? Das Wissen über diese Dinge ist die Grundlage für das Verständnis und den Entwurf sperrenfreier Programmieralgorithmen.
Die folgenden Dinge sind aus dem Internet zusammengestellt. Vielen Dank im Voraus fürs Teilen!
sync_fetch_and_add-Befehlsreihe Ich habe den besten Artikel über diese Befehlsreihe gefunden. Schüler, die gut Englisch können, können direkt zum Originaltext gehen. Multithread-Zugriff auf einfache Datentypen und atomare Variablen
sync_fetch_and_add-Reihe verfügt über insgesamt zwölf Funktionen, einschließlich Addition/Subtraktion/AND/OR/XOR/etc Die Operationsfunktion sync_fetch_and_add ruft, wie der Name schon sagt, zuerst ab, fügt sie dann hinzu und gibt den Wert zurück, bevor sie hinzugefügt wird. Nehmen Sie als Beispiel count = 4. Nach dem Aufruf von sync_fetch_and_add(&count,1) ist der Rückgabewert 4 und dann wird die Anzahl 5.
hat natürlich sync_fetch_and_add. Es gibt sync_add_and_fetch, die Bedeutung ist sehr klar. Zuerst hinzufügen und dann zurückkehren. Die Beziehung zwischen den beiden Brüdern ist dieselbe wie die zwischen i++ und ++i. Jeder, der von Tan Haoqiang vergewaltigt wurde oder von seinen Ältesten Schutzgelder erhalten hat, wird es genau wissen.
Mit dieser Babyfunktion haben wir eine neue Lösung. Damit Multithreads die globale -Variable selbst erhöhen können, müssen wir uns nicht mehr um Thread-Sperren kümmern. Die folgende Codezeile hat die gleiche Wirkung wie die oben durch pthread_mutex geschützte Codezeile und ist außerdem Thread-sicher .
sync_fetch_and_add( &global_int, 1 );
Das Folgende ist ein Familienporträt dieser Gruppe von Funktionen. Sie können anhand eines Blicks erkennen, was diese Funktionen bewirken ihre Namen.
Fügen Sie beim Kompilieren mit gcc die Option -march=i686 hinzu
// sam:在我的服务器上,发现不加都可以。 type sync_fetch_and_add (type *ptr, type value);type sync_fetch_and_sub (type *ptr, type value);type sync_fetch_and_or (type *ptr, type value);type sync_fetch_and_and (type *ptr, type value);type sync_fetch_and_xor (type *ptr, type value);type sync_fetch_and_nand (type *ptr, type value);type sync_add_and_fetch (type *ptr, type value);type sync_sub_and_fetch (type *ptr, type value);type sync_or_and_fetch (type *ptr, type value);type sync_and_and_fetch (type *ptr, type value);type sync_xor_and_fetch (type *ptr, type value);type sync_nand_and_fetch (type *ptr, type value);
// sam: Ich frage mich, warum die Auslassungspunkte danach geschrieben werden. Gibt es Parameter, um die wir uns nicht kümmern müssen? Bei der Verwendung müssen keine Parameter übergeben werden? Die folgenden beiden Funktionen sind genau das, was ich will, und sie können die Mutex-Sperrfunktion problemlos implementieren.
bool sync_bool_compare_and_swap (type*ptr, type oldval, type newval, ...)
type sync_val_compare_and_swap (type *ptr, type oldval, type newval , ...)
Diese beiden Funktionen ermöglichen einen atomaren Vergleich und Austausch. Wenn *ptr == oldval, schreiben Sie newval in *ptr,
Nein wahr, wenn gleich und geschrieben.
Die zweite Funktion gibt den Wert vor der Operation zurück.
sync_synchronize (...)
Um das oben Gesagte zu verstehen, lesen Sie bitte: blog.sunchangming.com/post/47188394133
Es gibt zwei weitere Funktionen:
type sync_lock_test_and_set (type *ptr, type value, ...)
Setze *ptr auf value und Gibt den Wert vor der *ptr-Operation zurück.
void sync_lock_release (type *ptr, ...)
Setzen Sie *ptr auf 0
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Linux-Beispiele ohne Sperre. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!