diff options
| author | Jacob Pratt <jacob@jhpratt.dev> | 2024-03-20 20:29:44 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-20 20:29:44 -0400 |
| commit | 43ad753adbebf843ebdc3d0d82e991a329a599bd (patch) | |
| tree | 3800a2a17a976b4afc2660fc1be7107e88de7ced /library/std/src/sys_common/thread_local_key.rs | |
| parent | 31adfd77d265b12b0ebc30101d816e8a99948988 (diff) | |
| parent | 34621757ea9437994ef717ac4f1928933a6e1b24 (diff) | |
Rollup merge of #122729 - m-ou-se:relax, r=Amanieu
Relax SeqCst ordering in standard library. Every single SeqCst in the standard library is unnecessary. In all cases, Relaxed or Release+Acquire was sufficient. As I [wrote](https://marabos.nl/atomics/memory-ordering.html#common-misconceptions) in my book on atomics: > [..] when reading code, SeqCst basically tells the reader: "this operation depends on the total order of every single SeqCst operation in the program," which is an incredibly far-reaching claim. The same code would likely be easier to review and verify if it used weaker memory ordering instead, if possible. For example, Release effectively tells the reader: "this relates to an acquire operation on the same variable," which involves far fewer considerations when forming an understanding of the code. > > It is advisable to see SeqCst as a warning sign. Seeing it in the wild often means that either something complicated is going on, or simply that the author did not take the time to analyze their memory ordering related assumptions, both of which are reasons for extra scrutiny. r? ````@Amanieu```` ````@joboet````
Diffstat (limited to 'library/std/src/sys_common/thread_local_key.rs')
| -rw-r--r-- | library/std/src/sys_common/thread_local_key.rs | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/library/std/src/sys_common/thread_local_key.rs b/library/std/src/sys_common/thread_local_key.rs index 204834984a2..7dcc1141099 100644 --- a/library/std/src/sys_common/thread_local_key.rs +++ b/library/std/src/sys_common/thread_local_key.rs @@ -128,7 +128,7 @@ impl StaticKey { #[inline] unsafe fn key(&self) -> imp::Key { - match self.key.load(Ordering::Relaxed) { + match self.key.load(Ordering::Acquire) { KEY_SENTVAL => self.lazy_init() as imp::Key, n => n as imp::Key, } @@ -156,8 +156,8 @@ impl StaticKey { match self.key.compare_exchange( KEY_SENTVAL, key as usize, - Ordering::SeqCst, - Ordering::SeqCst, + Ordering::Release, + Ordering::Acquire, ) { // The CAS succeeded, so we've created the actual key Ok(_) => key as usize, |
