ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

一个 Rust 多线程的笼统问题:一个值和它的引用交叉分布于不同线程中可以有多少种情况?哪些是合法的?

2026/9/3 5:36:29 拓冰建站 浏览量
一个 Rust 多线程的笼统问题:一个值和它的引用交叉分布于不同线程中可以有多少种情况?哪些是合法的? 特别声明:本博客长期遭受 51CTO 盗文、剽窃,反复投诉,对方置若罔闻,行为极其可耻,你的优质文章也极有可能已被 51CTO 盗用,详情参见《51CTO,一个抄袭剽窃的流氓网站!》:https://laurence.blog.csdn.net/article/details/162671992,本文多处嵌入此声明,盗用此文即传播了此声明!这是在研究 Send trait 时衍生出来的一个支线问题。我们说一个值跨线程 move 之所以会有线程安全问题(本文我们特指数据竞争问题)一定是有什么数据在 move 后会出现既被读又被写的情况,或者说本来这种数据就是既被读又被写的,只是在单线程环境下被人们忽略了,那会是什么数据呢?我们首先怀疑的就是值本身,但是,这个怀疑其实很容易排除,问题描述的是值的 move,move 只会改变所有权(由编译器记录下谁(哪个变量(绑定))将负责最后销毁值),不会修改任何数据。这里可能有人会担心:也许是 move 后,在新线程中又创建了不可变或可变引用呢,然后和再原线程中的引用一起来竞争值呢?这可能是很多人担心过,但又未必能清晰描述出来的场景,这里其实有好多臆想出来的假设,但实际上它们根本没法编译通过,本文我们就深入分析一下这个假设性问题。首先,这个问题可以重新表述为:在多线程环境中,一个值和它的引用可能会分布在多个线程