首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RefCell的替代方案可以是‘`Send`’?

RefCell的替代方案可以是‘`Send`’?
EN

Stack Overflow用户
提问于 2021-07-04 02:02:40
回答 1查看 968关注 0票数 4

我设计了一个可以在线程之间发送的类型,这取决于它是否是一个拥有的类型。

此代码:

代码语言:javascript
复制
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;
    });
}

给出

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-04 11:08:23

我知道这不是发送,因为RefCell是!发送。我想这是唯一能阻止我被送去的东西。

是的,这是正确的。

有发送的RefCell替代方案吗?

当然,至少有两个。如果您只想在另一个线程中使用&mut,那么实际上可以发送它:

代码语言:javascript
复制
#[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已经提到的那样:

代码语言:javascript
复制
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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68241145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档