我有一个创建一个RefCell
,然后代码要到RefCell
参考传递给单螺纹:如何确保不实现Sync的类型实际上可以在线程之间安全共享?
extern crate crossbeam;
use std::cell::RefCell;
fn main() {
let val = RefCell::new(1);
crossbeam::scope(|scope| {
scope.spawn(|| *val.borrow());
});
}
在完整的代码,我使用的是具有嵌入RefCell
类型它(一个typed_arena::Arena
)。我使用crossbeam来确保线程不会超过所需的参考。
这会产生错误:
error: the trait bound `std::cell::RefCell<i32>: std::marker::Sync` is not satisfied [E0277]
scope.spawn(|| *val.borrow());
^~~~~
我相信我明白为什么这个错误发生:RefCell
没有设计从多个线程同时调用,因为它使用内置的可变性,需要的常态机制单个可变借入不会阻止多个并发动作。这甚至在案Sync
:
Types that are not
Sync
are those that have "interior mutability" in a non-thread-safe way, such asCell
andRefCell
instd::cell
.
这是在这种情况下都很好,但,我知道,只有一个线程可以访问RefCell
。我如何向编译器申明我明白我在做什么,并确保这是事实?当然,如果我的推论说这实际上是安全的是不正确的,我会很乐意被告知为什么。
这是允许的,因为'RefCell'实现'发送'。 –
bluss