我有以下代码:
fn main() {
let message = "Can't shoot yourself in the foot if you ain't got no gun";
let t1 = std::thread::spawn(|| {
println!("{}", message);
});
t1.join();
}
rustc
给我编译错误:
闭包可能比当前函数寿命更长,但它借用
message
了当前函数所拥有的
这是错误的,因为:
它在这里指的功能是(我相信)main。一旦 main 完成执行,线程将被杀死或进入 UB。
它所指的函数清楚地在所述线程上调用 .join() 。
以前的代码在任何方面都不安全吗?如果是这样,为什么?如果不是,我怎样才能让编译器理解这一点?
编辑:是的,我知道在这种情况下我可以移动消息,我的问题是专门询问如何传递对它的引用(最好不必堆分配它,类似于此代码的执行方式:
std::thread([&message]() -> void {/* etc */});
(澄清一下,我实际上想要做的是从两个线程访问线程安全的数据结构......其他不涉及复制工作的问题的解决方案也会有所帮助)。
Edit2:这个被标记为重复的问题有 5 页长,因此我认为它本身就是无效的问题。