Struct std::sync::mpsc::SyncSender 1.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);
RunImplementations
在此同步通道上发送一个值。
该函数将阻塞,直到内部缓冲区中的空间可用或接收者可以将消息传递给它为止。
请注意,如果此通道上有缓冲区,则成功发送并不能保证接收者会看到数据。 该项可能会排队在内部缓冲区中,以供接收者在以后的时间接收。 但是,如果缓冲区大小为 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