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

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

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

可以使用 send 或 try_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

获取 self 的 TypeId。 Read more

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

从拥有的值中借用。 Read more

执行转换。

执行转换。

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

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

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

recently added

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

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

执行转换。

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

执行转换。