V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Richard14
V2EX  ›  Rust

Rust 两种典型使用场景求助

  •  1
     
  •   Richard14 · 2022-04-10 07:48:41 +08:00 · 2183 次点击
    这是一个创建于 987 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学,通过<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 要怎么确保互相引用是安全的?

    谢谢

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

    就我个人的经验,应当尽可能的 thread local ,减少不必要的线程同步(当然这个和 rust 本身已经关键不大了)。也不用太慌 unsafe ,为了性能该 unsafe 还是要 unsafe 的。
    stdying
        3
    stdying  
       2022-05-01 20:51:21 +08:00
    @NPC666 圣经如何
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1602 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:34 · PVG 00:34 · LAX 08:34 · JFK 11:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.