Rust 两种典型使用场景求助 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Richard14
V2EX    Rust

Rust 两种典型使用场景求助

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

    初学,通过<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     Solana     3138 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:09 PVG 20:09 LAX 04:09 JFK 07:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86