Rust 并发编程实战课
晁岳攀(鸟窝)
前微博技术专家,知名微服务框架 rpcx 作者
621 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已更新 26 讲/共 38 讲
Rust 并发编程实战课
15
15
1.0x
00:00/00:00
登录|注册

23|空前绝后,一劳永逸:Once同步原语

你好,我是鸟窝。
在前面两节课中,我们学习了互斥锁(Mutex)和读写锁(RwLock)这两种同步原语。今天我们来介绍另一个重要的同步原语,Once 以及 OnceLock 和 LazyLock。

Once

Once 是一个轻量级的同步原语,它的主要作用是确保某段代码在程序整个生命周期只执行一次。这在初始化全局变量或者实现单例模式时特别有用。
Once 的特点是:
一次性执行:Once 确保初始化代码只会执行一次,即使在多线程环境下也是如此。
线程安全:多个线程可以同时尝试执行初始化,但只有一个线程会成功执行。
同步等待:其他线程会等待初始化完成后才继续执行。
零开销:一旦初始化完成,后续的检查几乎没有性能开销。
先前 Rust 的标准库中仅此一种“执行一次”的同步机制,后来才添加了 OnceLock 和 lazyLock。
Once 的使用方法如下:
use std::sync::{Once, Arc};
use std::thread;
static mut RESOURCE: Option<i32> = None;
static INIT: Once = Once::new();
// 获取资源
fn get_resource() -> i32 {
INIT.call_once(|| { // 只初始化一次
unsafe {
RESOURCE = Some(42); // 初始化资源
}
println!("资源初始化完成, by thread {:?}", thread::current().id());
});
unsafe { RESOURCE.unwrap() }
}
fn main() {
let mut handles = vec![];
for _ in 0..5 {
let handle = thread::spawn(move || {
let value = get_resource();
println!("线程 {:?}, 获取资源: {}", thread::current().id(), value);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. Rust中提供了三种线程安全的初始化一次的数据类型:`Once`、`OnceLock` 和 `LazyLock`。 2. `Once` 是一种轻量级的同步原语,用于确保某段代码在程序的整个生命周期内只执行一次,特别适用于初始化全局变量或实现单例模式。 3. `OnceLock` 是一个线程安全的 `OnceCell`,提供了更丰富的初始化和访问方法,适用于静态变量的初始化。 4. `LazyLock` 是一个线程安全的 `LazyCell`,专注于延迟初始化,允许在首次访问时才执行初始化闭包,适用于静态变量和局部变量。 5. 这三种同步原语都用于确保代码只执行一次,或在首次访问时初始化,具有线程安全的特性,适用于多线程环境。 6. `Once` 提供了更细粒度的控制,而 `OnceLock` 和 `LazyLock` 则提供了更高级别的抽象,简化了常见用例。 7. `LazyLock` 还提供了延迟初始化的特性,使得复杂结构的初始化更加方便。 8. 这三种同步原语的使用可以简化全局变量的定义和访问,确保线程安全,避免资源重复初始化。 9. `Once` 在多线程环境下能保证线程安全,但如果初始化闭包发生 panic,实例会进入“中毒”状态,导致后续调用也发生 panic。 10. `OnceLock` 提供了更方便的线程安全的单次初始化,适用于需要一次性执行的场景,能够确保全局变量的初始化只执行一次。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 并发编程实战课》
新⼈⾸单¥98
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)