Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 无法通过通道发送结构:mpsc::Sender无法在线程之间安全共享_Multithreading_Rust - Fatal编程技术网

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在这里抱怨频道的发送者没有被包装。这是否回答了你的问题?