Module std::sync::atomic 1.0.0[−][src]
Expand description
原子类型
原子类型提供线程之间的原始共享内存通信,并且是其他并发类型的构建块。
该模块定义了一些基本类型的原子版本,包括 AtomicBool,AtomicIsize,AtomicUsize,AtomicI8,AtomicU16 等。
原子类型表示可正确使用的操作,这些操作可在线程之间同步更新。
每种方法都使用一个 Ordering 来表示该操作的内存屏障的强度。这些顺序与 C++20 atomic orderings 相同。有关更多信息,请参见 nomicon。
原子变量可以安全地在线程之间共享 (它们实现 Sync),但是它们本身并不提供共享机制并遵循 Rust 的 threading model。
共享原子变量的最常见方法是将其放入 Arc (原子引用计数的共享指针)。
原子类型可以存储在静态变量中,可以使用常量初始化程序 (如 AtomicBool::new) 进行初始化。原子静态常用于懒惰的初始化。
Portability
如果可用,则保证该模块中的所有原子类型均为 lock-free。这意味着他们没有在内部获得一个整体互斥锁。不能保证原子类型和操作无需等待。
这意味着可以使用比较和交换循环来实现类似 fetch_or 的操作。
原子操作可以在指令层用更大的原子来实现。例如,某些平台使用 4 字节原子指令来实现 AtomicI8。
请注意,此仿真不应影响代码的正确性,这只是需要注意的事情。
此模块中的原子类型可能并非在所有平台上都可用。但是,这里的原子类型都是广泛可用的,并且通常可以依赖现有原子类型。一些值得注意的例外是:
- PowerPC 和带有 32 位指针的 MIPS 平台不具有
AtomicU64或AtomicI64类型。 - ARM 不适用于 Linux 的
armv5te之类的平台仅提供load和store操作,并且不支持 Compare and Swap (CAS) 操作,例如swap,fetch_add等。 此外,在 Linux 上,这些 CAS 操作是通过 operating system support 实现的,这可能会降低性能。 - ARM 使用
thumbv6m的目标仅提供load和store操作,不支持比较和交换 (CAS) 操作,例如swap,fetch_add等。
请注意,可能会添加 future 平台,这些平台也不支持某些原子操作。最大程度地讲,可移植代码将要注意所使用的原子类型。
AtomicUsize 和 AtomicIsize 通常是最便携的,但是即使到了那时,它们也并非随处可用。
对于引用,std 库需要指针大小的原子,尽管 core 不需要。
当前,您主要需要使用 #[cfg(target_arch)] 来有条件地用原子编译代码。还有一个不稳定的 #[cfg(target_has_atomic)],可以在 future 中将其稳定下来。
Examples
一个简单的自旋锁:
use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; use std::{hint, thread}; fn main() { let spinlock = Arc::new(AtomicUsize::new(1)); let spinlock_clone = Arc::clone(&spinlock); let thread = thread::spawn(move|| { spinlock_clone.store(0, Ordering::SeqCst); }); // 等待另一个线程释放锁 while spinlock.load(Ordering::SeqCst) != 0 { hint::spin_loop(); } if let Err(panic) = thread.join() { println!("Thread had an error: {:?}", panic); } }Run
保持活动线程的数量:
use std::sync::atomic::{AtomicUsize, Ordering}; static GLOBAL_THREAD_COUNT: AtomicUsize = AtomicUsize::new(0); let old_thread_count = GLOBAL_THREAD_COUNT.fetch_add(1, Ordering::SeqCst); println!("live threads: {}", old_thread_count + 1);Run
Structs
| AtomicBool | 可以在线程之间安全共享的布尔类型。 |
| AtomicI8 | 可以在线程之间安全共享的整数类型。 |
| AtomicI16 | 可以在线程之间安全共享的整数类型。 |
| AtomicI32 | 可以在线程之间安全共享的整数类型。 |
| AtomicI64 | 可以在线程之间安全共享的整数类型。 |
| AtomicIsize | 可以在线程之间安全共享的整数类型。 |
| AtomicPtr | 可以在线程之间安全共享的裸指针类型。 |
| AtomicU8 | 可以在线程之间安全共享的整数类型。 |
| AtomicU16 | 可以在线程之间安全共享的整数类型。 |
| AtomicU32 | 可以在线程之间安全共享的整数类型。 |
| AtomicU64 | 可以在线程之间安全共享的整数类型。 |
| AtomicUsize | 可以在线程之间安全共享的整数类型。 |
Enums
| Ordering | 原子内存顺序 |
Constants
| ATOMIC_I8_INIT | DeprecatedExperimental 初始化为 |
| ATOMIC_I16_INIT | DeprecatedExperimental 初始化为 |
| ATOMIC_I32_INIT | DeprecatedExperimental 初始化为 |
| ATOMIC_I64_INIT | DeprecatedExperimental 初始化为 |
| ATOMIC_U8_INIT | DeprecatedExperimental 初始化为 |
| ATOMIC_U16_INIT | DeprecatedExperimental 初始化为 |
| ATOMIC_U32_INIT | DeprecatedExperimental 初始化为 |
| ATOMIC_U64_INIT | DeprecatedExperimental 初始化为 |
| ATOMIC_BOOL_INIT | Deprecated
|
| ATOMIC_ISIZE_INIT | Deprecated 初始化为 |
| ATOMIC_USIZE_INIT | Deprecated 初始化为 |
Functions
| compiler_fence | 编译器内存防护。 |
| fence | 原子 fence。 |
| spin_loop_hint | Deprecated 向处理器发出信号,通知它处于忙于等待的自旋循环 (自旋锁) 中。 |