Struct std::sync::mpsc::SyncSender1.0.0[][src]

pub struct SyncSender<T> { /* fields omitted */ }
Expand description

Rust 的同步 sync_channel 类型的发送一半。

可以使用 sendtry_send 通过此通道发送消息。

send 如果内部缓冲区中没有空间,则将阻塞。

Examples

use std::sync::mpsc::sync_channel;
use std::thread;

// 创建一个缓冲区大小为 2 的 sync_channel
let (sync_sender, receiver) = sync_channel(2);
let sync_sender2 = sync_sender.clone();

// 第一个线程拥有 sync_sender
thread::spawn(move || {
    sync_sender.send(1).unwrap();
    sync_sender.send(2).unwrap();
});

// 第二个线程拥有 sync_sender2
thread::spawn(move || {
    sync_sender2.send(3).unwrap();
    // 由于缓冲区已满,线程现在将阻塞
    println!("Thread unblocked!");
});

let mut msg;

msg = receiver.recv().unwrap();
println!("message {} received", msg);

// "Thread unblocked!" 现在将打印

msg = receiver.recv().unwrap();
println!("message {} received", msg);

msg = receiver.recv().unwrap();

println!("message {} received", msg);
Run

Implementations

在此同步通道上发送一个值。

该函数将阻塞,直到内部缓冲区中的空间可用或接收者可以将消息传递给它为止。

请注意,如果此通道上有缓冲区,则成功发送并不能保证接收者会看到数据。 该项可能会排队在内部缓冲区中,以供接收者在以后的时间接收。 但是,如果缓冲区大小为 0,则通道成为集合通道,并且如果此函数返回成功,则它保证接收者确实已接收到数据。

此函数永远不会 panic,但是如果 Receiver 已断开连接并且不再能够接收信息,则它可能返回 Err

Examples

use std::sync::mpsc::sync_channel;
use std::thread;

// 创建一个缓冲区大小为 0 的集合点 sync_channel
let (sync_sender, receiver) = sync_channel(0);

thread::spawn(move || {
   println!("sending message...");
   sync_sender.send(1).unwrap();
   // 现在线程被阻塞,直到收到消息为止

   println!("...message received!");
});

let msg = receiver.recv().unwrap();
assert_eq!(1, msg);
Run

尝试在此通道上发送值而不会阻塞。

此方法不同于 send,如果通道的缓冲区已满或没有接收者正在等待获取某些数据,则立即返回。 与 send 相比,此函数有两种故障情况,而不是一种情况 (一种情况是断开连接,一种情况是完整的缓冲区)。

请参见 send,以获取有关确保此函数成功后接收方是否已接收到数据的说明。

Examples

use std::sync::mpsc::sync_channel;
use std::thread;

// 创建一个缓冲区大小为 1 的 sync_channel
let (sync_sender, receiver) = sync_channel(1);
let sync_sender2 = sync_sender.clone();

// 第一个线程拥有 sync_sender
thread::spawn(move || {
    sync_sender.send(1).unwrap();
    sync_sender.send(2).unwrap();
    // 线程被阻塞
});

// 第二个线程拥有 sync_sender2
thread::spawn(move || {
    // 如果缓冲区已满,这将返回错误并且不发送任何消息
    let _ = sync_sender2.try_send(3);
});

let mut msg;
msg = receiver.recv().unwrap();
println!("message {} received", msg);

msg = receiver.recv().unwrap();
println!("message {} received", msg);

// 第三条消息可能从未发送过
match receiver.try_recv() {
    Ok(msg) => println!("message {} received", msg),
    Err(_) => println!("the third message was never sent"),
}
Run

Trait Implementations

返回值的副本。 Read more

source 执行复制分配。 Read more

使用给定的格式化程序格式化该值。 Read more

执行此类型的析构函数。 Read more

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

从拥有的值中一成不变地借用。 Read more

从拥有的值中借用。 Read more

执行转换。

执行转换。

获得所有权后的结果类型。

通常通过克隆从借用数据中创建拥有的数据。 Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

recently added

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more

发生转换错误时返回的类型。

执行转换。

发生转换错误时返回的类型。

执行转换。