Struct std::sync::mpsc::SyncSender

1.0.0 · source ·
pub struct SyncSender<T> { /* private fields */ }
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 {msg} received");

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

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

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

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

Implementations§

source§

impl<T> SyncSender<T>

source

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

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"),
}
Run

Trait Implementations§

source§

impl<T> Clone for SyncSender<T>

source§

fn clone(&self) -> SyncSender<T>

返回值的副本。 Read more
source§

fn clone_from(&mut self, source: &Self)

source 执行复制分配。 Read more
1.8.0 · source§

impl<T> Debug for SyncSender<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

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

impl<T> Drop for SyncSender<T>

source§

fn drop(&mut self)

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

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> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

获取 selfTypeIdRead more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

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

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

从拥有的值中借用。 Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

返回未更改的参数。

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

调用 U::from(self)

也就是说,这种转换是 From<T> for U 实现选择执行的任何操作。

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

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

fn to_owned(&self) -> T

从借用的数据创建拥有的数据,通常是通过克隆。 Read more
source§

fn clone_into(&self, target: &mut T)

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

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

执行转换。
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

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

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

执行转换。