Module std::sync1.0.0[][src]

Expand description

有用的同步原语。

需要同步

从概念上讲,Rust 程序是将在计算机上执行的一系列操作。程序中发生的事件的时间线与代码中操作的顺序一致。

考虑下面的代码,对某些静态变量进行操作:

static mut A: u32 = 0;
static mut B: u32 = 0;
static mut C: u32 = 0;

fn main() {
    unsafe {
        A = 3;
        B = 4;
        A = A + B;
        C = B;
        println!("{} {} {}", A, B, C);
        C = A;
    }
}
Run

似乎存储在存储器中的某些变量已更改,执行了加法运算,结果存储在 A 中,并且变量 C 被修改了两次。

当仅涉及单个线程时,结果如预期的那样: 7 4 4 行被打印。

至于幕后发生的情况,启用优化后,最终生成的机器代码可能看起来与代码有很大不同:

  • C 的第一个存储区可能在存储区移至 AB 之前已被移至 as if

  • 可以删除 A + BA 的分配,因为总和可以存储在一个临时位置,直到打印出来为止,并且变量永远不会更新。

  • 最终结果可以仅通过在编译时查看代码来确定,因此 constant folding 可能会将整个块变成一个简单的 println!("7 4 4")

只要最终的优化代码在执行时产生的结果与没有优化的结果相同,编译器就可以执行这些优化的任何组合。

由于现代计算机中使用了 并发,因此有关程序执行顺序的假设通常是错误的。 即使禁用了编译器优化,访问变量变量也可能导致不确定的结果, 仍然可能 ** 引入同步错误。

请注意,由于 Rust 的安全保证,假设我们在此模块中未使用任何同步原语,则访问 (static) 变量需要 unsafe 代码。

乱序执行

由于多种原因,指令的执行顺序与我们定义的顺序可以不同:

  • 编译器 重新排序指令: 如果编译器可以在较早的时候发出指令,它将尝试这样做。 例如,它可能会在代码块的顶部提升内存负载,以便 CPU 可以从内存中启动 预取 值。

    在单线程方案中,这可能会在编写信号处理程序或某些类型的代码时引起问题。 使用 compiler fences 防止此重新排序。

  • 一个单处理器 ** 执行指令 out-of-order: 现代的 CPU 能够执行 超标量,也就是说,多个指令可能同时执行,即使机器代码描述的是一个顺序过程。

    这种重新排序由 CPU 透明地处理。

  • 同时执行多个硬件线程的 多处理器 系统: 在多线程方案中,可以使用两种原语来处理同步:

    • memory fences 确保以正确的顺序使内存访问对其他 CPU 可见。
    • atomic operations 确保同时访问同一内存位置不会导致未定义的行为。

更高级别的同步对象

大多数同步原语都非常容易出错,使用起来也不方便,这就是为什么标准库还公开了一些更高级别的同步对象的原因。

这些抽象可以在较低级别的原语基础上构建。 为了提高效率,标准库中的同步对象通常是在操作系统内核的帮助下实现的,该内核可以在线程被锁定而被阻塞时重新安排线程的时间。

以下是可用的同步对象的概述:

  • RwLock: 提供一种互斥机制,该机制同时允许多个 readers,而一次仅允许一个 writer。在某些情况下,这可能比互斥锁更有效。

Modules

atomic

原子类型

mpsc

多生产者,单消费者 FIFO 队列通信原语。

Structs

Arc

线程安全的引用计数指针。Arc 代表原子引用计数。

Barrier

屏障使多个线程能够同步某些计算的开始。

BarrierWaitResult

Barrier 中的所有线程都汇合时,Barrier::wait() 将返回 BarrierWaitResult

Condvar

条件变量

Mutex

互斥原语可用于保护共享数据

MutexGuard

互斥锁的 “scoped lock” 的 RAII 实现。 当此结构体被丢弃 (离开作用域) 时,这个锁将被解锁。

Once

同步原语,可用于运行一次性初始化。 对于 FFI 或相关功能的一次性初始化很有用。 该类型只能用 Once::new() 构造。

OnceState

状态产生于 [Once::call_once_force () ] 的闭包参数。 该状态可用于查询 Once 的中毒状态。

PoisonError

一种错误类型,每当获取锁时都可以返回该错误。

RwLock

reader-writer 锁

RwLockReadGuard

RAII 结构,用于在丢弃锁时释放锁的共享读取访问。

RwLockWriteGuard

RAII 结构,用于在锁被丢弃时释放对锁的独占写访问。

WaitTimeoutResult

指示是否因超时而返回的条件变量的定时等待的类型。

Weak

WeakArc 的版本,该版本对托管分配具有非所有权引用。 通过调用 Weak 指针上的 upgrade 来访问该分配,该指针返回 Option<Arc<T>>

Enums

TryLockError

枚举可能与 TryLockResult 相关的错误,这些错误可能是从 Mutex 上的 try_lock 方法或 RwLock 上的 try_readtry_write 方法获取锁时发生的。

Constants

ONCE_INITDeprecated

静态 Once 值的初始化值。

Type Definitions

LockResult

一种类型别名,用于可能导致中毒的锁定方法。

TryLockResult

一种非别名锁定方法结果的类型别名。