15|tokio编程:在多任务之间操作同一片数据
任务目标
潜在问题
- 深入了解
- 翻译
- 解释
- 总结
Rust语言中使用tokio编程时,多任务之间共享数据的问题及解决方案是本文的主要内容。文章首先强调了并发任务之间共享数据的重要性,并讨论了可能出现的问题,如数据竞争和系统紊乱。作者提出了解决方案,包括全局变量和在main函数中创建对象实例传递给各个任务。然而,全局变量不适合多任务并发程序,应尽可能避免使用。文章介绍了在Rust中使用Arc智能指针和Mutex来实现多任务共享数据的方法。通过具体示例和讨论,展示了在tokio编程中如何处理多任务共享数据的问题,以及Rust语言提供的多种机制来解决这一问题。文章还介绍了RwLock和std::sync::atomic等其他锁的使用方法。总体而言,本文深入浅出,适合读者快速了解tokio编程中的并发数据共享问题及解决方案。文章通过验证的方式,展示了在Rust和tokio中如何在多个任务中操作共享数据,强调了Rust所有权模型在并发场景下的重要作用。整个探索过程虽然辛苦,但结果却是美好的,体现了Rust的学习过程。
《Rust 语言从入门到实战》,新⼈⾸单¥59
全部留言(19)
- 最新
- 精选
- lilp1. 应该是防止这两个任务还没走完,主线程就结束了? 2. 不会阻塞。我理解的是这两个任务 同时启动,顺序完成。不管他俩怎么去抢这个锁 最后的完成顺序应该还是和main中写的.await() 顺序一样。
作者回复: 1 是的。 2 spawn后就立即执行。后面这两句只是等待任务返回。在执行第二句之前有可能第二个任务已经执行完了,第二句只是把其任务的返回值取回来。
2023-11-23归属地:广东24 - PEtFiShawait代码会持续等待直到任务结束,因此在main thread里第一行会阻塞第二行。但这不会让task_a阻塞task_b。加入await可以使最后的println!打印两个任务执行完以后被修改的db值,如果不加入await。有一定几率最后println!打印的还是原始的db
作者回复: 👍
2023-11-23归属地:上海2 - -有个疑问,Arc::new(Mutex::new(db))后可以将一个不可变的变量变成可变变量?这个是什么原因
作者回复: 思考得很棒,前后联系起来了。arc mutex 其实是拿到了对象所有权,有所有权了当然修改值就方便了。跟前面并不冲突,当然如果还想深入下去,可以看看 内部可变性 这个概念。
2023-11-22归属地:北京32 - seven9t可以说下如果用rust自带的Mutex而不是tokio的会有什么问题 (是否必须配套
作者回复: 关于这个话题,可以看下tokio官网的一个说明:https://tokio.rs/tokio/tutorial/shared-state 区别就是要不要跨 await 边界。
2024-01-14归属地:广东1 - yunyi1、为了等待任务完成 2、不会阻塞,两个任务是并行运行的,结果也有可能是被改成50,taskb先完成,再执行taska。
作者回复: 👍
2024-01-12归属地:广东1 - 下雨天看实现,就当前例子而言task_a不会阻塞task_b。 如果task_a中loop{}下就可以阻塞了。 有个疑问,为啥task::spawn后面会自动执行呢? 我理解只有.await了才会加到调度器里面执行。
作者回复: spawn比较特殊,特殊处理的
2023-11-23归属地:湖北31 - Geek_72807e请问老师,方案四中,会不会出现两次修改操作顺序不确定的问题,最终结构可以是40,也会是100?
作者回复: 很棒的思考👍,有可能出现。看哪个任务后执行完成,后抢到锁。
2023-11-22归属地:山西21 - 雍和会,因为要获取mutex
作者回复: 不会,你执行就知道了。原因在下一讲有讲。
2023-11-22归属地:广东1 - Geek_3b58b9对原子变量的读写访问可以用指针?还是说应该用专门的API?我记得原子类型有特定的CPU指令的
作者回复: 智能指针不是传统意义上的c那种指针。 锁的实现就需要用到指令集层面的原子指令来优化。
2024-01-15归属地:江苏 - yunyi哇 ,居然看到了Erlang的字眼,我一直是用erlang做为主力语言的后端开发,最近在学rust,找了很多资料,最后买了老师的教程,如获至宝
作者回复: 幸会幸会
2024-01-12归属地:广东