Rust 两种典型使用场景求助

2022-04-10 07:48:41 +08:00
 Richard14

初学,通过<The Rust Programming Language>学习了 rust ,想问一下关于以下场景在 rust 的最佳实现是什么。

A 、场景:多线程共享状态。

假设需求为,在一台 8 核心电脑上,由主线程创建 8 个子线程。主线程有变量 int a ,8 个子线程中逻辑为 while 循环每次 a++;直到 a 大于 1 亿为止退出子线程。

根据书中描述,Rust 可以使用 mutex 互斥锁来实现上述需求,我的问题有以下几点:

  1. 正常如 java 场景中类似需求可能使用偏向锁来减小同步开销,但 rust 书中似乎并无相关内容,那么生产环境应该如何实现呢?
  2. rust 书中推荐使用 channel 来同步,对于状态同步这种需求是否不适合用 channel 实现?
  3. 状态同步有一些进阶需求,比如如果我希望 8 个线程交替输出(即每次都从 1 到 8 每个线程执行一次 a++,而不是各个线程乱序执行),例如 java 中实现方法很多,比如可以使用信号量来实现,rust 中又该如何实现呢?

B 、场景:循环引用。

关于这个需求我暂时没想出合适的使用场景,只是在看 rust 的过程中产生疑问。即 rust 通过所有权来确保代码安全,那么对于典型的所有权交错的情况,按 rust 的设计思想应该如何处理呢?比如有 A ,B 两类,实例化后要求 A 对象中引用 B ,B 对象中引用 A ,rust 要怎么确保互相引用是安全的?

谢谢

2155 次点击
所在节点    Rust
3 条回复
NPC666
2022-04-10 10:39:49 +08:00
建议学 rust 圣经里 https://course.rs/about-book.html
ihciah
2022-04-10 18:04:22 +08:00
A:
这个需求本身推荐直接 atomic 。锁的话你也可以自己实现,常见需求用 parking_lot 就好。
channel 内部往往也有锁或 CAS 。
涉及等待,thread 的话标准库有信号量等,async task 的话可以用 tokio/futures 等库提供的实现。
反正实在不行,自己搞 syscall 总能做。
B: 可控且性能要求高的循环引用可以直接 unsafe 手动来,比如实现双向链表。或者引入 Rc/Arc 等智能指针走引用计数。

就我个人的经验,应当尽可能的 thread local ,减少不必要的线程同步(当然这个和 rust 本身已经关键不大了)。也不用太慌 unsafe ,为了性能该 unsafe 还是要 unsafe 的。
stdying
2022-05-01 20:51:21 +08:00
@NPC666 圣经如何

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845995

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX