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

26|各取所需,节制有度:Semaphore信号量

你好,我是鸟窝。
在上节课我们已经了解了 Rust 的异步编程的基本知识,而且我们也学会了编写异步编程的代码。但是 Rust 标准库并没有提供异步运行时的实现,所以我们需要借助第三方实现的异步运行时库。
信号量(Semaphore)是一种经典的同步原语,用于控制对共享资源的访问。它维护一个计数器,表示可用资源的数量。线程可以通过以下两种操作来使用信号量:
acquire()(P 操作或 down 操作):尝试获取一个许可。如果计数器大于 0,则计数器减 1,线程继续执行;否则,线程将被阻塞,直到有许可可用。
release()(V 操作或 up 操作):释放一个许可,使计数器加 1。如果有等待的线程,则唤醒其中一个。
信号量的核心在于对计数器的管理,通过限制计数器的值,可以控制同时访问共享资源的线程数量。
信号量在并发编程中有广泛的应用,以下是一些常见的场景:
资源限制:限制同时访问某个资源的线程数量,例如数据库连接池、文件句柄等。
线程同步:协调多个线程的执行顺序,例如生产者 - 消费者模型。
互斥锁:实现互斥访问共享资源,相当于二元信号量(计数器初始值为 1)。
流量控制:限制系统的并发请求数量,防止系统过载。
Rust 标准库中并没有实现信号量同步原语,就像 Go 语言一样(Go 官方扩展库中实现了一个信号量),我也觉得很奇怪,这个信号量是最早被研究的同步原语之一,使用场景也很广泛,为啥两大编程语言都不在标准库中实现呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 信号量(Semaphore)是一种经典的同步原语,用于控制对共享资源的访问,维护一个计数器表示可用资源的数量。 2. Rust标准库中并没有实现信号量同步原语,但是`tokio`库提供了信号量的实现,通过`tokio::sync::Semaphore`结构体实现。 3. `tokio::sync::Semaphore`维护一组许可(permits),允许同时有多个调用者访问共享资源,使用公平策略按请求顺序分配许可。 4. 通过`acquire`方法从信号量中获取许可,`release`通过`drop(permit)`方式释放许可,实现资源的动态管理。 5. `const_new`函数创建一个指定初始许可的信号量常量,可在编译时被调用,提供潜在的性能优势。 6. 信号量在并发编程中有广泛的应用,包括资源限制、线程同步、互斥锁、流量控制等场景,是一种重要的同步原语。 7. 信号量的使用场景包括限制并发发送的请求数量和限流,可以通过实现令牌桶的方式实现限流。 8. 信号量在资源限制、线程同步、流量控制等场景中都有丰富的应用,是一种重要的同步原语。 9. 请你使用信号量实现有一个有界缓冲区(固定大小的队列),支持多生产者-多消费者。

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

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部