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);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