首先:

use std::thread;
use std::sync::Arc;
use std::sync::Mutex;
#[derive(Debug)]
struct MyBox(*const u8);
unsafe impl Send for MyBox {}
unsafe impl Sync for MyBox {}

fn main() {
    let b = &MyBox(5 as *const u8);
    let v = Arc::new(Mutex::new(b));
    let t = thread::spawn(move || {
        let _v1 =  v.lock().unwrap();
    });
    t.join().unwrap();
}

第二:

use std::thread;
use std::sync::Arc;
use std::sync::Mutex;
#[derive(Debug)]
struct MyBox(*const u8);
unsafe impl Send for MyBox {}
unsafe impl Sync for MyBox {}

fn main() {
    let b = MyBox(5 as *const u8);
    let v = Arc::new(Mutex::new(&b));
    let t = thread::spawn(move || {
        let _v1 =  v.lock().unwrap();
    });
    t.join().unwrap();
}

第一会是.但第二:b活得不够久借来的价值活得不够久 这是怎么回事?它们都是MyBox引用.

推荐答案

表达式MyBox(5 as *const u8)仅由常量(和一些其他标准)组成,因此可以是const promoted.因此,当您创建b作为引用时,该值实际上可以放入静态存储中,因此b&'static MyBox.

在第二种情况下,当b不是引用时,它不会使用静态存储,因为b无疑是一个局部变量,因此具有函数局部存储.因此,对该值的引用不能满足thread::spawn所需的'static个生存期.

另外,当您想要创建可以引用局部变量的线程时,应该使用thread::scope.

Rust相关问答推荐

捕获Rust因C++异常而产生panic

如何从Rust记录WASM堆内存使用情况?

如何在Rust中实现Functor trait?

从Type::new()调用函数

我如何制作一个变异迭代器来锁定内部数据直到删除?

在生存期内将非静态可变引用转换为范围内的静态可变引用

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

在文件链实施中绕过borrow 判断器

不能在Rust中使用OpenGL绘制三角形

go 重并堆积MPSC通道消息

Rust中如何实现一个与Sized相反的负特性(Unsized)

max(ctz(x), ctz(y)) 有更快的算法吗?

分配给下划线模式时会发生什么?

Rust 生命周期:这两种类型声明为不同的生命周期

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

如何将 Rust 中的树状 struct 展平为 Vec<&mut ...>?

只有一个字符被读入作为词法分析器的输入

通用类型,不同于输入类型,作为函数的返回值

如何从 many0 传播 Nom 失败上下文?

如何制作具有关联类型的特征的类型擦除版本?