Crust of Rust: Atomics and Memory Ordering
Channel: Jon Gjengset
Date: 2021-04-02

In this episode of Crust of Rust, we go over Rust's atomic types, including the mysterious Ordering enum. In particular, we explore the std::sync::atomic module, and look at how its components can be used to implement concurrency primitives like mutexes. We also investigate some of the gotchas and sometimes counter-intuitive behaviors of the atomic primitives with different memory orderings, as well as strategies for testing for and debugging errors in concurrent code.

0:00:00 Introduction
0:02:03 What are atomics?
0:05:26 The Memory Model
0:07:33 AtomicUsize
0:12:23 Questions so far
0:20:20 Implementing a (bad) Mutex
0:27:39 Our Mutex works!
0:33:04 Pesky thread interleavings
0:39:42 compare_exchange
0:44:54 Mitigating compare_exchange contention
0:50:43 compare_exchange_weak
0:57:02 Ordering::Relaxed
1:12:13 Ordering::Acquire/Release
1:26:00 The fetch_ methods
1:34:07 Ordering::SeqCst
2:00:08 Breather
2:00:40 ThreadSanitizer
2:05:49 loom
2:22:09 Atomic fences
2:27:27 volatile
2:32:18 AtomicPtr
2:35:13 Atomics through FFI
2:36:44 Consume ordering?
2:38:08 Closing thoughts

You can read more about Rust's memory model in the Rust reference at https://doc.rust-lang.org/nightly/reference/memory-model.html and in the C++ memory model documentation at https://en.cppreference.com/w/cpp/atomic/memory_order.

Live version with chat: https://www.youtube.com/watch?v=0Vq2aJxwB1o