Rust Atomics und Locks Lesenotizen Kapitel 2 Atomics

  1. Atomare Operationen stellen den Eckpfeiler der Multithread-Implementierung dar. Mutex- und Bedingungsvariablen werden durch atomare Operationen implementiert.
  2. std::sync::atomicEinschließ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.
  3. 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 in RelaxedThread A zuerst die Variable
  4. 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;
  5. 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;
  6. ! Seite 38 stellt ein klassisches Problem bei der Überprüfung der Semantik des Move-Compilers dar, nämlich for t in 0..4den Konflikt zwischen dem Lebenszyklus von t und dem Lebenszyklus des später erzeugten Threads. Beachten Sie, dass atomicder Typ nicht die Kopierfunktion implementiert, sondern Sync implementiert, was bedeutet, dass seine gemeinsame Referenz &T in mehreren Threads übergeben werden kann;
  7. ! 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 asserteinem Bereichstd::process::abort befinden .fetch_subcompare-and-exchangeArc::clone()thread::scope
  8. 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.
  9. 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).
  10. fetch_update()Die Methode entspricht load()der Verwendung einer Schleife zum Berechnen des Aktualisierungswerts und dem anschließenden Aufruf, compare_exchange_weakum die Richtigkeit der Aktualisierung sicherzustellen. Informationen zur Verwendungsmethode finden Sie auf Seite 45;
  11. Seite 46 zeigt ein Szenario, in dem die Verwendung effizienter ist compare_exchange()als die Verwendung von ;compare_exchnage_weak()
  12. Die Verwendung std::sync::Oncevon und kann das Szenario lösen, das std::sync::OnceLockim Singleton generate_random_key()zu lange dauert, aber nicht wiederholt aufgerufen werden soll, und stellt sicher, dass eine statische Variable nur einmal initialisiert wird.

おすすめ

転載: blog.csdn.net/Mint2yx4/article/details/130644125