有关如何在 Rust 多线程内共享内存 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Richard14
V2EX    Rust

有关如何在 Rust 多线程内共享内存

  •  
  •   Richard14 2022-06-10 21:19:37 +08:00 2378 次点击
    这是一个创建于 1287 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人小白。以往 rust 中多线程需求都能按照建议用通道解决,近期一个需求需要操作大型三维数组,业务逻辑上是可以划分多线程的(同一时段内操作仅局限在单一维度里进行),但是想了想不适合用管道做,因为需要大量的内存拷贝,如果用了的话也许拷贝本身浪费很多开销。

    尝试按照 rust 标准书指导的在线程间共享 Arc ,但是得到提示 cannot borrow data in an Arc as mutable ,传入线程闭包的 arc 对象无法被修改,必须要加一个 mutex ,但是一个疑惑 mutex 本身是互斥锁,本身各线程如果操作逻辑上不相关的数据时候理想情况是尽可能把锁优化掉,如果一定要加锁的话,现在又加了这种全局锁,那多线程操作又有什么意义呢?

    6 条回复    2022-06-14 19:08:26 +08:00
    Buges
        1
    Buges  
       2022-06-10 21:33:51 +08:00 via Android
    最直接的就是锁的分片。比如读取和写入分开,数据不同部位分开。
    不过对于并行计算问题,优先考虑 rayon 。https://github.com/rayon-rs/rayon
    可能你手写写半天,rayon 一个 par_iter 就解决了。
    Richard14
        2
    Richard14  
    OP
       2022-06-10 21:39:13 +08:00
    @Buges 不同部位分开以后感觉没必要上锁了吧,rust 要求下还是一定要锁吗。另外 rayon 确实搜到很多技术博客里也推荐,大佬有什么推荐的入门文章么
    Richard14
        3
    Richard14  
    OP
       2022-06-10 21:41:58 +08:00
    @Buges 另外我的代码里是普通地用循环实现的操作,而不是用迭代器,感觉 rayon 介绍里那个神奇的 par_iter 用不上
    Buges
        4
    Buges  
       2022-06-10 22:00:18 +08:00 via Android
    @Richard14 Rust 里 Mutex 是一种线程安全的 interior mutability 容器,即可以通过对容器本身的只读访问获得容器内对象的读写访问。
    不同部位分开锁就是 Mutex<Vec<T>>和 Vec<Mutex<T>>的区别。
    rayon 本身就是设计的简单易用的库,直接看文档就行了。iter 可以配合 map/filter/reduce 及各种 combinator ,很多情况下比手写循环更方便,而且可读性要好的多。
    greygoo
        5
    greygoo  
       2022-06-14 15:41:45 +08:00 via Android
    不用 Arc ,如果不同部分可以分开的话把原切片分成若干个&mut []然后 move 进每个线程里面就可以了
    my3157
        6
    my3157  
       2022-06-14 19:08:26 +08:00
    UnsafeCell 包一层, 实现内部可变性, 内部按需实现锁的粒度
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2611 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 50ms UTC 11:26 PVG 19:26 LAX 03:26 JFK 06:26
    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