Struct std::sync::mpsc::SyncSender
1.0.0 · source · pub struct SyncSender<T> { /* private fields */ }
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 {msg} received");
// 现在将打印 "Thread unblocked!"
msg = receiver.recv().unwrap();
println!("message {msg} received");
msg = receiver.recv().unwrap();
println!("message {msg} received");
RunImplementations§
source§impl<T> SyncSender<T>
impl<T> SyncSender<T>
sourcepub fn send(&self, t: T) -> Result<(), SendError<T>>
pub fn send(&self, t: T) -> Result<(), SendError<T>>
在此同步通道上发送一个值。
该函数将阻塞,直到内部缓冲区中的空间可用或接收者可以将消息传递给它为止。
请注意,如果此通道上有缓冲区,则成功发送并不能保证接收者会看到数据。 该项可能会排队在内部缓冲区中,以供接收者在以后的时间接收。 但是,如果缓冲区大小为 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);
Runsourcepub fn try_send(&self, t: T) -> Result<(), TrySendError<T>>
pub fn try_send(&self, t: T) -> Result<(), TrySendError<T>>
尝试在此通道上发送值而不会阻塞。
此方法不同于 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 {msg} received");
msg = receiver.recv().unwrap();
println!("message {msg} received");
// 第三条消息可能从未发送过
match receiver.try_recv() {
Ok(msg) => println!("message {msg} received"),
Err(_) => println!("the third message was never sent"),
}
RunTrait Implementations§
source§impl<T> Clone for SyncSender<T>
impl<T> Clone for SyncSender<T>
source§fn clone(&self) -> SyncSender<T>
fn clone(&self) -> SyncSender<T>
返回值的副本。 Read more
source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
从
source
执行复制分配。 Read more1.8.0 · source§impl<T> Debug for SyncSender<T>
impl<T> Debug for SyncSender<T>
impl<T: Send> Send for SyncSender<T>
Auto Trait Implementations§
impl<T> RefUnwindSafe for SyncSender<T>
impl<T> Sync for SyncSender<T>where T: Send,
impl<T> Unpin for SyncSender<T>
impl<T> UnwindSafe for SyncSender<T>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
从拥有的值中借用。 Read more