78、Sync trait
Sync(同步)
在结束本章之前,我们来学习一下 Rust 标准库中的另一个关键特性:同步 (Sync)。
同步 (Sync) 是一个自动特性,就像 Send 一样。
所有可以在线程间安全共享的类型都会自动实现同步特性。
换句话说:如果 &T 是 Send,则 T 是Sync。
T:Sync并不意味着T:Send
需要注意的是,T 是同步(Sync)的同时可以不是发送(Send)。 例如:MutexGuard 不是发送(Send),但它是同步(Sync)。
它不是发送(Send),因为锁必须在获取它的同一线程上释放,因此我们不希望 MutexGuard 被释放到不同的线程上。
但它是同步(Sync),因为将 &MutexGuard 传递给另一个线程不会影响锁的释放位置。
T:Send并不意味着T:Sync
反之亦然:T 可以是 Send 类型,但并非 Sync 类型。
例如:RefCell<T> 是 Send 类型(如果 T 是 Send 类型),但它不是 Sync 类型。
RefCell<T> 会执行运行时借用检查,但它用于跟踪借用的计数器并非线程安全。因此,多个线程持有 &RefCell会导致数据竞争,多个线程可能同时获得对同一数据的可变引用。因此,RefCell不是 Sync 类型。而 Send 类型则没有问题,因为当我们将 RefCell发送给另一个线程时,不会留下任何对其所包含数据的引用,因此不存在并发可变访问的风险。
阅读剩余
版权声明:
作者:CN059
链接:https://www.cn059.com/2025/11/25/78%e3%80%81sync-trait.html
文章版权归作者所有,未经允许请勿转载。
THE END
