Multithreading 无法通过通道发送结构:mpsc::Sender无法在线程之间安全共享
我正在努力通过通道发送自定义结构 我将值包装在Multithreading 无法通过通道发送结构:mpsc::Sender无法在线程之间安全共享,multithreading,rust,Multithreading,Rust,我正在努力通过通道发送自定义结构 我将值包装在弧和互斥体中,如教程中所述, 但它无论如何都不会编译 extern crate num; use num::bigint::BigInt; use std::io::{self, Write}; use std::sync::mpsc; use std::thread; use readline::readline as ask; use std::sync::{Arc, Mutex}; enum Command { Quit,
弧
和互斥体
中,如教程中所述,
但它无论如何都不会编译
extern crate num;
use num::bigint::BigInt;
use std::io::{self, Write};
use std::sync::mpsc;
use std::thread;
use readline::readline as ask;
use std::sync::{Arc, Mutex};
enum Command {
Quit,
Help,
Factorial { n: BigInt },
Error { msg: String },
}
fn main() {
let (input_tx, input_rx) = mpsc::channel();
let input_thread = thread::spawn(|| {
input_tx.send(Arc::new(Mutex::new(Command::Quit)));
});
}
错误:特性绑定'std::sync::mpsc::Sender:std::marker::sync'不满足[E0277]
让输入_thread=thread::spawn(| |{
^~~~~~~~~~~~~
帮助:运行'rustc--explain E0277'查看详细说明
注意:`std::sync::mpsc::Sender`不能在线程之间安全共享
注意:由于“&std::sync::mpsc::Sender”的“std::marker::Send”impl上的要求,因此需要此选项`
注意:必需,因为它出现在类型中`[closure@src/main.rs:25:38:65:6输入\u发送:&std::同步::mpsc::发送方]`
注意:std::thread::spawn需要`
错误:由于上一个错误而中止
我使用的是Rust 1.10.0(cfcb716cf 2016-07-03)。传递到
thread::spawn()
的闭包必须是move
(FnOnce
)。Arc
和互斥锁不需要:
let input_thread = thread::spawn(move || {
input_tx.send(Command::Quit);
});
传递给thread::spawn()
的闭包必须是move
(FnOnce
)。Arc
和Mutex
:
let input_thread = thread::spawn(move || {
input_tx.send(Command::Quit);
});
看看这个:
以及错误消息:
`std::sync::mpsc::Sender`不能在线程之间安全地共享;因为`&std::sync::mpsc::Sender`的impl上的要求,所以必须使用它`
(强调矿山)
默认情况下,闭包捕获对其内部使用的任何变量的引用。这是大多数情况下您想要的,因为放弃所有权对闭包的创建者来说更具限制性。使用引用允许捕获的值在闭包外部和内部之间共享,并且不需要移动任何位
在这种情况下,您确实希望将input_tx
的所有权授予闭包。这是因为闭包本身的所有权将授予一个新线程,因此闭包及其所有内容都需要安全地交给另一个线程。线程之间可能不会共享对发送方的引用
A要求将任何捕获变量的所有权转移到闭包。这样做,就没有共享,并且满足了所有要求。如下所示:
有时,您需要转移某些捕获变量的所有权,但希望共享其他变量。由于move
闭包要么全是,要么什么都不是,因此在这种情况下,您需要更加明确。您只需在闭包之前获取一个引用:
let a = 42;
let a_ref = &a;
let input_thread = thread::spawn(move || {
println!("{}", a_ref);
});
这不起作用,因为对a
的引用不是静态的,而是显示了总体思路。看看这个:
以及错误消息:
`std::sync::mpsc::Sender`不能在线程之间安全地共享;因为`&std::sync::mpsc::Sender`的impl上的要求,所以必须使用它`
(强调矿山)
默认情况下,闭包捕获对其内部使用的任何变量的引用。这是大多数情况下您想要的,因为放弃所有权对闭包的创建者来说更具限制性。使用引用允许捕获的值在闭包外部和内部之间共享,并且不需要移动任何位
在这种情况下,您确实希望将input_tx
的所有权授予闭包。这是因为闭包本身的所有权将授予一个新线程,因此闭包及其所有内容都需要安全地交给另一个线程。线程之间可能不会共享对发送方的引用
A要求将任何捕获变量的所有权转移到闭包。这样做,就没有共享,并且满足了所有要求。如下所示:
有时,您需要转移某些捕获变量的所有权,但希望共享其他变量。由于move
闭包要么全是,要么什么都不是,因此在这种情况下,您需要更加明确。您只需在闭包之前获取一个引用:
let a = 42;
let a_ref = &a;
let input_thread = thread::spawn(move || {
println!("{}", a_ref);
});
这不起作用,因为对a
的引用不是'静态的
,而是显示了总体思路。注意:您将值包装在通道内,但是编译器在这里抱怨发送到通道的发送者没有包装。这是否回答了您的问题?注意:您将值包装在通道内,但compiler在这里抱怨频道的发送者没有被包装。这是否回答了你的问题?