Module std::sync::atomic1.0.0[][src]

Expand description

原子类型

原子类型提供线程之间的原始共享内存通信,并且是其他并发类型的构建块。

该模块定义了一些基本类型的原子版本,包括 AtomicBoolAtomicIsizeAtomicUsizeAtomicI8AtomicU16 等。 原子类型表示可正确使用的操作,这些操作可在线程之间同步更新。

每种方法都使用一个 Ordering 来表示该操作的内存屏障的强度。这些顺序与 C++20 atomic orderings 相同。有关更多信息,请参见 nomicon

原子变量可以安全地在线程之间共享 (它们实现 Sync),但是它们本身并不提供共享机制并遵循 Rust 的 threading model

共享原子变量的最常见方法是将其放入 Arc (原子引用计数的共享指针)。

原子类型可以存储在静态变量中,可以使用常量初始化程序 (如 AtomicBool::new) 进行初始化。原子静态常用于懒惰的初始化。

Portability

如果可用,则保证该模块中的所有原子类型均为 lock-free。这意味着他们没有在内部获得一个整体互斥锁。不能保证原子类型和操作无需等待。 这意味着可以使用比较和交换循环来实现类似 fetch_or 的操作。

原子操作可以在指令层用更大的原子来实现。例如,某些平台使用 4 字节原子指令来实现 AtomicI8。 请注意,此仿真不应影响代码的正确性,这只是需要注意的事情。

此模块中的原子类型可能并非在所有平台上都可用。但是,这里的原子类型都是广泛可用的,并且通常可以依赖现有原子类型。一些值得注意的例外是:

  • PowerPC 和带有 32 位指针的 MIPS 平台不具有 AtomicU64AtomicI64 类型。
  • ARM 不适用于 Linux 的 armv5te 之类的平台仅提供 loadstore 操作,并且不支持 Compare and Swap (CAS) 操作,例如 swapfetch_add 等。 此外,在 Linux 上,这些 CAS 操作是通过 operating system support 实现的,这可能会降低性能。
  • ARM 使用 thumbv6m 的目标仅提供 loadstore 操作,不支持比较和交换 (CAS) 操作,例如 swapfetch_add 等。

请注意,可能会添加 future 平台,这些平台也不支持某些原子操作。最大程度地讲,可移植代码将要注意所使用的原子类型。 AtomicUsizeAtomicIsize 通常是最便携的,但是即使到了那时,它们也并非随处可用。 对于引用,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_INITDeprecatedExperimental

初始化为 0 的原子整数。

ATOMIC_I16_INITDeprecatedExperimental

初始化为 0 的原子整数。

ATOMIC_I32_INITDeprecatedExperimental

初始化为 0 的原子整数。

ATOMIC_I64_INITDeprecatedExperimental

初始化为 0 的原子整数。

ATOMIC_U8_INITDeprecatedExperimental

初始化为 0 的原子整数。

ATOMIC_U16_INITDeprecatedExperimental

初始化为 0 的原子整数。

ATOMIC_U32_INITDeprecatedExperimental

初始化为 0 的原子整数。

ATOMIC_U64_INITDeprecatedExperimental

初始化为 0 的原子整数。

ATOMIC_BOOL_INITDeprecated

AtomicBool 初始化为 false

ATOMIC_ISIZE_INITDeprecated

初始化为 0 的原子整数。

ATOMIC_USIZE_INITDeprecated

初始化为 0 的原子整数。

Functions

compiler_fence

编译器内存防护。

fence

原子 fence。

spin_loop_hintDeprecated

向处理器发出信号,通知它处于忙于等待的自旋循环 (自旋锁) 中。