@@ -891,6 +891,19 @@ impl AtomicBool {
891891///            Err(false)); 
892892/// assert_eq!(some_bool.load(Ordering::Relaxed), false); 
893893/// ``` 
894+ /// 
895+ /// # Considerations 
896+ /// 
897+ /// `compare_exchange` is a [compare-and-swap operation] and thus exhibits the usual downsides 
898+ /// of CAS operations. In particular, a load of the value followed by a successful 
899+ /// `compare_exchange` with the previous load *does not ensure* that other threads have not 
900+ /// changed the value in the interim. This is usually important when the *equality* check in 
901+ /// the `compare_exchange` is being used to check the *identity* of a value, but equality 
902+ /// does not necessarily imply identity. In this case, `compare_exchange` can lead to the 
903+ /// [ABA problem]. 
904+ /// 
905+ /// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
906+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
894907#[ inline]  
895908    #[ stable( feature = "extended_compare_and_swap" ,  since = "1.10.0" ) ]  
896909    #[ doc( alias = "compare_and_swap" ) ]  
@@ -973,6 +986,19 @@ impl AtomicBool {
973986///     } 
974987/// } 
975988/// ``` 
989+ /// 
990+ /// # Considerations 
991+ /// 
992+ /// `compare_exchange` is a [compare-and-swap operation] and thus exhibits the usual downsides 
993+ /// of CAS operations. In particular, a load of the value followed by a successful 
994+ /// `compare_exchange` with the previous load *does not ensure* that other threads have not 
995+ /// changed the value in the interim. This is usually important when the *equality* check in 
996+ /// the `compare_exchange` is being used to check the *identity* of a value, but equality 
997+ /// does not necessarily imply identity. In this case, `compare_exchange` can lead to the 
998+ /// [ABA problem]. 
999+ /// 
1000+ /// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
1001+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
9761002#[ inline]  
9771003    #[ stable( feature = "extended_compare_and_swap" ,  since = "1.10.0" ) ]  
9781004    #[ doc( alias = "compare_and_swap" ) ]  
@@ -1271,11 +1297,14 @@ impl AtomicBool {
12711297/// 
12721298/// # Considerations 
12731299/// 
1274- /// This method is not magic; it is not provided by the hardware. 
1275- /// It is implemented in terms of [`AtomicBool::compare_exchange_weak`], and suffers from the same drawbacks. 
1276- /// In particular, this method will not circumvent the [ABA Problem]. 
1300+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
1301+ /// critical section or mutex. 
1302+ /// 
1303+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
1304+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem]. 
12771305/// 
12781306/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
1307+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
12791308/// 
12801309/// # Examples 
12811310/// 
@@ -1338,11 +1367,14 @@ impl AtomicBool {
13381367/// 
13391368/// # Considerations 
13401369/// 
1341- /// This method is not magic; it is not provided by the hardware. 
1342- /// It is implemented in terms of [`AtomicBool::compare_exchange_weak`], and suffers from the same drawbacks. 
1343- /// In particular, this method will not circumvent the [ABA Problem]. 
1370+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
1371+ /// critical section or mutex. 
1372+ /// 
1373+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
1374+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem]. 
13441375/// 
13451376/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
1377+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
13461378/// 
13471379/// # Examples 
13481380/// 
@@ -1393,11 +1425,14 @@ impl AtomicBool {
13931425/// 
13941426/// # Considerations 
13951427/// 
1396- /// This method is not magic; it is not provided by the hardware. 
1397- /// It is implemented in terms of [`AtomicBool::compare_exchange_weak`], and suffers from the same drawbacks. 
1398- /// In particular, this method will not circumvent the [ABA Problem]. 
1428+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
1429+ /// critical section or mutex. 
1430+ /// 
1431+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
1432+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem]. 
13991433/// 
14001434/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
1435+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
14011436/// 
14021437/// # Examples 
14031438/// 
@@ -1825,6 +1860,20 @@ impl<T> AtomicPtr<T> {
18251860/// let value = some_ptr.compare_exchange(ptr, other_ptr, 
18261861///                                       Ordering::SeqCst, Ordering::Relaxed); 
18271862/// ``` 
1863+ /// 
1864+ /// # Considerations 
1865+ /// 
1866+ /// `compare_exchange` is a [compare-and-swap operation] and thus exhibits the usual downsides 
1867+ /// of CAS operations. In particular, a load of the value followed by a successful 
1868+ /// `compare_exchange` with the previous load *does not ensure* that other threads have not 
1869+ /// changed the value in the interim. This is usually important when the *equality* check in 
1870+ /// the `compare_exchange` is being used to check the *identity* of a value, but equality 
1871+ /// does not necessarily imply identity. This is a particularly common case for pointers, as 
1872+ /// a pointer holding the same address does not imply that the same object exists at that 
1873+ /// address! In this case, `compare_exchange` can lead to the [ABA problem]. 
1874+ /// 
1875+ /// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
1876+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
18281877#[ inline]  
18291878    #[ stable( feature = "extended_compare_and_swap" ,  since = "1.10.0" ) ]  
18301879    #[ cfg( target_has_atomic = "ptr" ) ]  
@@ -1874,6 +1923,20 @@ impl<T> AtomicPtr<T> {
18741923///     } 
18751924/// } 
18761925/// ``` 
1926+ /// 
1927+ /// # Considerations 
1928+ /// 
1929+ /// `compare_exchange` is a [compare-and-swap operation] and thus exhibits the usual downsides 
1930+ /// of CAS operations. In particular, a load of the value followed by a successful 
1931+ /// `compare_exchange` with the previous load *does not ensure* that other threads have not 
1932+ /// changed the value in the interim. This is usually important when the *equality* check in 
1933+ /// the `compare_exchange` is being used to check the *identity* of a value, but equality 
1934+ /// does not necessarily imply identity. This is a particularly common case for pointers, as 
1935+ /// a pointer holding the same address does not imply that the same object exists at that 
1936+ /// address! In this case, `compare_exchange` can lead to the [ABA problem]. 
1937+ /// 
1938+ /// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
1939+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
18771940#[ inline]  
18781941    #[ stable( feature = "extended_compare_and_swap" ,  since = "1.10.0" ) ]  
18791942    #[ cfg( target_has_atomic = "ptr" ) ]  
@@ -1917,11 +1980,15 @@ impl<T> AtomicPtr<T> {
19171980/// 
19181981/// # Considerations 
19191982/// 
1920- /// This method is not magic; it is not provided by the hardware. 
1921- /// It is implemented in terms of [`AtomicPtr::compare_exchange_weak`], and suffers from the same drawbacks. 
1922- /// In particular, this method will not circumvent the [ABA Problem]. 
1983+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
1984+ /// critical section or mutex. 
1985+ /// 
1986+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
1987+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem], 
1988+ /// which is a particularly common pitfall for pointers! 
19231989/// 
19241990/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
1991+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
19251992/// 
19261993/// # Examples 
19271994/// 
@@ -1992,11 +2059,15 @@ impl<T> AtomicPtr<T> {
19922059/// 
19932060/// # Considerations 
19942061/// 
1995- /// This method is not magic; it is not provided by the hardware. 
1996- /// It is implemented in terms of [`AtomicPtr::compare_exchange_weak`], and suffers from the same drawbacks. 
1997- /// In particular, this method will not circumvent the [ABA Problem]. 
2062+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
2063+ /// critical section or mutex. 
2064+ /// 
2065+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
2066+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem], 
2067+ /// which is a particularly common pitfall for pointers! 
19982068/// 
19992069/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
2070+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
20002071/// 
20012072/// # Examples 
20022073/// 
@@ -2057,11 +2128,15 @@ impl<T> AtomicPtr<T> {
20572128/// 
20582129/// # Considerations 
20592130/// 
2060- /// This method is not magic; it is not provided by the hardware. 
2061- /// It is implemented in terms of [`AtomicPtr::compare_exchange_weak`], and suffers from the same drawbacks. 
2062- /// In particular, this method will not circumvent the [ABA Problem]. 
2131+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
2132+ /// critical section or mutex. 
2133+ /// 
2134+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
2135+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem], 
2136+ /// which is a particularly common pitfall for pointers! 
20632137/// 
20642138/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
2139+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
20652140/// 
20662141/// # Examples 
20672142/// 
@@ -2967,6 +3042,20 @@ macro_rules! atomic_int {
29673042///            Err(10)); 
29683043/// assert_eq!(some_var.load(Ordering::Relaxed), 10); 
29693044/// ``` 
3045+ /// 
3046+ /// # Considerations 
3047+ /// 
3048+ /// `compare_exchange` is a [compare-and-swap operation] and thus exhibits the usual downsides 
3049+ /// of CAS operations. In particular, a load of the value followed by a successful 
3050+ /// `compare_exchange` with the previous load *does not ensure* that other threads have not 
3051+ /// changed the value in the interim! This is usually important when the *equality* check in 
3052+ /// the `compare_exchange` is being used to check the *identity* of a value, but equality 
3053+ /// does not necessarily imply identity. This is a particularly common case for pointers, as 
3054+ /// a pointer holding the same address does not imply that the same object exists at that 
3055+ /// address! In this case, `compare_exchange` can lead to the [ABA problem]. 
3056+ /// 
3057+ /// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
3058+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
29703059[ inline] 
29713060            #[ $stable_cxchg] 
29723061            #[ $cfg_cas] 
@@ -3016,6 +3105,20 @@ macro_rules! atomic_int {
30163105///     } 
30173106/// } 
30183107/// ``` 
3108+ /// 
3109+ /// # Considerations 
3110+ /// 
3111+ /// `compare_exchange` is a [compare-and-swap operation] and thus exhibits the usual downsides 
3112+ /// of CAS operations. In particular, a load of the value followed by a successful 
3113+ /// `compare_exchange` with the previous load *does not ensure* that other threads have not 
3114+ /// changed the value in the interim. This is usually important when the *equality* check in 
3115+ /// the `compare_exchange` is being used to check the *identity* of a value, but equality 
3116+ /// does not necessarily imply identity. This is a particularly common case for pointers, as 
3117+ /// a pointer holding the same address does not imply that the same object exists at that 
3118+ /// address! In this case, `compare_exchange` can lead to the [ABA problem]. 
3119+ /// 
3120+ /// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
3121+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
30193122[ inline] 
30203123            #[ $stable_cxchg] 
30213124            #[ $cfg_cas] 
@@ -3246,13 +3349,16 @@ macro_rules! atomic_int {
32463349            /// 
32473350/// # Considerations 
32483351/// 
3249- /// This method is not magic; it is not provided by the hardware. 
3250- /// It is implemented in terms of 
3251- [ doc = concat!( "[`" ,  stringify!( $atomic_type) ,  "::compare_exchange_weak`]," ) ] 
3252-             /// and suffers from the same drawbacks. 
3253- /// In particular, this method will not circumvent the [ABA Problem]. 
3352+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
3353+ /// critical section or mutex. 
3354+ /// 
3355+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
3356+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem] 
3357+ /// if this atomic integer is an index or more generally if knowledge of only the *bitwise value* 
3358+ /// of the atomic is not in and of itself sufficient to ensure any required preconditions. 
32543359/// 
32553360/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
3361+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
32563362/// 
32573363/// # Examples 
32583364/// 
@@ -3309,13 +3415,16 @@ macro_rules! atomic_int {
33093415            /// 
33103416/// # Considerations 
33113417/// 
3312- /// This method is not magic; it is not provided by the hardware. 
3313- /// It is implemented in terms of 
3314- [ doc = concat!( "[`" ,  stringify!( $atomic_type) ,  "::compare_exchange_weak`]," ) ] 
3315-             /// and suffers from the same drawbacks. 
3316- /// In particular, this method will not circumvent the [ABA Problem]. 
3418+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
3419+ /// critical section or mutex. 
3420+ /// 
3421+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
3422+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem] 
3423+ /// if this atomic integer is an index or more generally if knowledge of only the *bitwise value* 
3424+ /// of the atomic is not in and of itself sufficient to ensure any required preconditions. 
33173425/// 
33183426/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
3427+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
33193428/// 
33203429/// # Examples 
33213430/// 
@@ -3367,13 +3476,17 @@ macro_rules! atomic_int {
33673476            /// 
33683477/// # Considerations 
33693478/// 
3370- /// This method is not magic; it is not provided by the hardware. 
3371- /// It is implemented in terms of 
3372- [ doc = concat!( "[`" ,  stringify!( $atomic_type) ,  "::compare_exchange_weak`]," ) ] 
3373-             /// and suffers from the same drawbacks. 
3374- /// In particular, this method will not circumvent the [ABA Problem]. 
3479+ /// [CAS operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
3480+ /// This method is not magic; it is not provided by the hardware, and does not act like a 
3481+ /// critical section or mutex. 
3482+ /// 
3483+ /// It is implemented on top of an atomic [compare-and-swap operation], and thus is subject to 
3484+ /// the usual drawbacks of CAS operations. In particular, be careful of the [ABA problem] 
3485+ /// if this atomic integer is an index or more generally if knowledge of only the *bitwise value* 
3486+ /// of the atomic is not in and of itself sufficient to ensure any required preconditions. 
33753487/// 
33763488/// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem 
3489+ /// [compare-and-swap operation]: https://en.wikipedia.org/wiki/Compare-and-swap 
33773490/// 
33783491/// # Examples 
33793492/// 
0 commit comments