我设计了一个可以在线程之间发送的类型,这取决于它是否是一个拥有的类型。
此代码:
use std::cell::RefCell;
use std::rc::Rc;
pub enum M<'a, T> {
Owned(),
Ref(Rc<RefCell<&'a mut [T]>>)
}
fn main() {
let m: M<'static, u8> = M::Owned();
std::thread::spawn(||{
let m = m;
});
}给出
error[E0277]: `Rc<RefCell<&mut [_]>>` cannot be sent between threads safely
--> src/main.rs:11:5
|
11 | std::thread::spawn(||{
| _____^^^^^^^^^^^^^^^^^^_-
| | |
| | `Rc<RefCell<&mut [_]>>` cannot be sent between threads safely
12 | | let m = m;
13 | | });
| |_____- within this `[closure@src/main.rs:11:24: 13:6]`我知道这不是Send,因为RefCell是!Send。我认为这是阻止M成为Send的唯一原因。是否有RefCell替代方案,即Send?
发布于 2021-07-04 11:08:23
我知道这不是发送,因为RefCell是!发送。我想这是唯一能阻止我被送去的东西。
是的,这是正确的。
有发送的RefCell替代方案吗?
当然,至少有两个。如果您只想在另一个线程中使用&mut,那么实际上可以发送它:
#[derive(Debug)]
pub enum M<'a, T> {
Owned(),
Ref(&'a mut [T])
}
fn main() {
let m: M<'static, u8> = M::Owned();
std::thread::spawn(move ||{
println!("{:?}", m);
}).join().unwrap();
}但是,如果您使用Rc<RefCell<_>>使您的&mut共享,您可以在使用Arc<Mutex<_>>的多线程环境中实现相同的功能,就像@Locke已经提到的那样:
use std::sync::{Arc, Mutex};
#[derive(Debug, Clone)]
pub enum M<'a, T> {
Owned(),
Ref(Arc<Mutex<&'a mut [T]>>)
}
fn main() {
let m: M<'static, u8> = M::Owned();
let m2 = m.clone();
std::thread::spawn(move ||{
println!("{:?}", m2);
}).join().unwrap();
println!("{:?}", m);
}https://stackoverflow.com/questions/68241145
复制相似问题