- Atomare Operationen stellen den Eckpfeiler der Multithread-Implementierung dar. Mutex- und Bedingungsvariablen werden durch atomare Operationen implementiert.
std::sync::atomic
Einschließlich der in Rust integrierten atomaren Operationstypen (wie AtomicI32, AtomicUsize usw.), von denen die meisten von der Hardwarearchitektur und dem zu implementierenden Betriebssystem abhängen, stellen fast alle Plattformen (Plattformen) atomare Typen zumindest auf der Zeigerebene (Zeigerebene) bereit.- Jede atomare Operation verfügt über einen Parameter
std::sync::atomic::Ordering
, der die relative Reihenfolge bestimmt, in der diese atomaren Operationen intern ausgeführt werden sollen. Die entspannteste Reihenfolge besteht darin, dass inRelaxed
Thread A zuerst die Variable load(&self, ordering: Ordering), store(&self)
Der erste Parameter von ist eine gemeinsame Referenz (gemeinsame Referenz) &T anstelle einer exklusiven Referenz (exklusive Referenz) &mut T, der Wert von T kann jedoch weiterhin geändert werden;- Die Fetch-and-Modify-Operation betrachtet Fetch-Modify als atomare Operation und gibt den Wert vor der Änderung zurück. Gleichzeitig sollte auf die Implementierung des Umbruchverhaltens geachtet werden
fetch_add() 和 fetch_sub()
. Einzelheiten finden Sie auf Seite 37; - ! Seite 38 stellt ein klassisches Problem bei der Überprüfung der Semantik des Move-Compilers dar, nämlich
for t in 0..4
den Konflikt zwischen dem Lebenszyklus von t und dem Lebenszyklus des später erzeugten Threads. Beachten Sie, dassatomic
der Typ nicht die Kopierfunktion implementiert, sondern Sync implementiert, was bedeutet, dass seine gemeinsame Referenz &T in mehreren Threads übergeben werden kann; - ! Auf Seite 41 wurde ein Anwendungsfall zum Generieren einer eindeutigen ID angegeben. So stellen Sie sicher, dass die generierte ID jedes Mal eindeutig ist und nicht überläuft. Die erste Lösung besteht darin, in Panik zu geraten, wenn die ID eine bestimmte Anzahl überschreitet, den Prozess zu bestehen oder zu stoppen. Die zweite Lösung besteht darin, gleichzeitig den Wert der ID zu verringern. Die dritte Lösung verwendet Operationen. Die erste Lösung ist hier nur die Methode, die in der Standardbibliothek zum Verarbeiten der Anzahl der Ausleihen verwendet wird, und die zweite Lösung besteht darin, die IDs zu verarbeiten, wie viele Threads sich gleichzeitig in
assert
einem Bereichstd::process::abort
befinden .fetch_sub
compare-and-exchange
Arc::clone()
thread::scope
compare_exchange(&self, expected:i32, new:i32, success_order: Ordering, failure_order:: Ordering)
Die Signatur von ist komplexer, kann aber zur Implementierung aller anderen atomaren Operationen verwendet werden. Seite 43 gibt ein Beispiel für die Verwendung von Compare_Exchange zur Implementierung von Fetch_Add.- Wenn ein ABA-Problem auftritt,
compare_exchange_weak()
ist die Verwendung effektiver, und selbst wenn der aktuelle Wert dem erwarteten Wert entspricht, kann auch Err zurückgegeben werden. In dieser Situation wird mit dem möglichen irreführenden Vergleichen und Austauschen umgegangen (d. h. dem ABA-Problem. Kurz nach Abschluss des Ladevorgangs wird der Wert von atomic geändert und dann wieder zurück geändert, um den ursprünglichen Wert der Kompilierung zu täuschen. Der ursprüngliche Wert hat sich nicht geändert, hat sich aber tatsächlich geändert). fetch_update()
Die Methode entsprichtload()
der Verwendung einer Schleife zum Berechnen des Aktualisierungswerts und dem anschließenden Aufruf,compare_exchange_weak
um die Richtigkeit der Aktualisierung sicherzustellen. Informationen zur Verwendungsmethode finden Sie auf Seite 45;- Seite 46 zeigt ein Szenario, in dem die Verwendung effizienter ist
compare_exchange()
als die Verwendung von ;compare_exchnage_weak()
- Die Verwendung
std::sync::Once
von und kann das Szenario lösen, dasstd::sync::OnceLock
im Singletongenerate_random_key()
zu lange dauert, aber nicht wiederholt aufgerufen werden soll, und stellt sicher, dass eine statische Variable nur einmal initialisiert wird.
Rust Atomics und Locks Lesenotizen Kapitel 2 Atomics
Guess you like
Origin blog.csdn.net/Mint2yx4/article/details/130644125
Recommended
Ranking