pub struct Sender<T> { /* private fields */ }mpmc_channel)Expand description
The sending-half of Rust’s synchronous channel type.
Messages can be sent through this channel with send.
Note: all senders (the original and its clones) need to be dropped for the receiver
to stop blocking to receive messages with Receiver::recv.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc::channel;
use std::thread;
let (sender, receiver) = channel();
let sender2 = sender.clone();
// First thread owns sender
thread::spawn(move || {
sender.send(1).unwrap();
});
// Second thread owns sender2
thread::spawn(move || {
sender2.send(2).unwrap();
});
let msg = receiver.recv().unwrap();
let msg2 = receiver.recv().unwrap();
assert_eq!(3, msg + msg2);Implementations§
Source§impl<T> Sender<T>
impl<T> Sender<T>
Sourcepub fn try_send(&self, msg: T) -> Result<(), TrySendError<T>>
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn try_send(&self, msg: T) -> Result<(), TrySendError<T>>
mpmc_channel)Attempts to send a message into the channel without blocking.
This method will either send a message into the channel immediately or return an error if the channel is full or disconnected. The returned error contains the original message.
If called on a zero-capacity channel, this method will send the message only if there happens to be a receive operation on the other side of the channel at the same time.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc::{channel, Receiver, Sender};
let (sender, _receiver): (Sender<i32>, Receiver<i32>) = channel();
assert!(sender.try_send(1).is_ok());Sourcepub fn send(&self, msg: T) -> Result<(), SendError<T>>
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn send(&self, msg: T) -> Result<(), SendError<T>>
mpmc_channel)Attempts to send a value on this channel, returning it back if it could not be sent.
A successful send occurs when it is determined that the other end of
the channel has not hung up already. An unsuccessful send would be one
where the corresponding receiver has already been deallocated. Note
that a return value of Err means that the data will never be
received, but a return value of Ok does not mean that the data
will be received. It is possible for the corresponding receiver to
hang up immediately after this function returns Ok. However, if
the channel is zero-capacity, it acts as a rendezvous channel and a
return value of Ok means that the data has been received.
If the channel is full and not disconnected, this call will block until the send operation can proceed. If the channel becomes disconnected, this call will wake up and return an error. The returned error contains the original message.
If called on a zero-capacity channel, this method will wait for a receive operation to appear on the other side of the channel.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc::channel;
let (tx, rx) = channel();
// This send is always successful
tx.send(1).unwrap();
// This send will fail because the receiver is gone
drop(rx);
assert!(tx.send(1).is_err());Source§impl<T> Sender<T>
impl<T> Sender<T>
Sourcepub fn send_timeout(
&self,
msg: T,
timeout: Duration,
) -> Result<(), SendTimeoutError<T>>
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn send_timeout( &self, msg: T, timeout: Duration, ) -> Result<(), SendTimeoutError<T>>
mpmc_channel)Waits for a message to be sent into the channel, but only for a limited time.
If the channel is full and not disconnected, this call will block until the send operation can proceed or the operation times out. If the channel becomes disconnected, this call will wake up and return an error. The returned error contains the original message.
If called on a zero-capacity channel, this method will wait for a receive operation to appear on the other side of the channel.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc::channel;
use std::time::Duration;
let (tx, rx) = channel();
tx.send_timeout(1, Duration::from_millis(400)).unwrap();Sourcepub fn send_deadline(
&self,
msg: T,
deadline: Instant,
) -> Result<(), SendTimeoutError<T>>
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn send_deadline( &self, msg: T, deadline: Instant, ) -> Result<(), SendTimeoutError<T>>
mpmc_channel)Waits for a message to be sent into the channel, but only until a given deadline.
If the channel is full and not disconnected, this call will block until the send operation can proceed or the operation times out. If the channel becomes disconnected, this call will wake up and return an error. The returned error contains the original message.
If called on a zero-capacity channel, this method will wait for a receive operation to appear on the other side of the channel.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc::channel;
use std::time::{Duration, Instant};
let (tx, rx) = channel();
let t = Instant::now() + Duration::from_millis(400);
tx.send_deadline(1, t).unwrap();Sourcepub fn is_empty(&self) -> bool
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn is_empty(&self) -> bool
mpmc_channel)Returns true if the channel is empty.
Note: Zero-capacity channels are always empty.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc;
use std::thread;
let (send, _recv) = mpmc::channel();
let tx1 = send.clone();
let tx2 = send.clone();
assert!(tx1.is_empty());
let handle = thread::spawn(move || {
tx2.send(1u8).unwrap();
});
handle.join().unwrap();
assert!(!tx1.is_empty());Sourcepub fn is_full(&self) -> bool
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn is_full(&self) -> bool
mpmc_channel)Returns true if the channel is full.
Note: Zero-capacity channels are always full.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc;
use std::thread;
let (send, _recv) = mpmc::sync_channel(1);
let (tx1, tx2) = (send.clone(), send.clone());
assert!(!tx1.is_full());
let handle = thread::spawn(move || {
tx2.send(1u8).unwrap();
});
handle.join().unwrap();
assert!(tx1.is_full());Sourcepub fn len(&self) -> usize
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn len(&self) -> usize
mpmc_channel)Returns the number of messages in the channel.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc;
use std::thread;
let (send, _recv) = mpmc::channel();
let (tx1, tx2) = (send.clone(), send.clone());
assert_eq!(tx1.len(), 0);
let handle = thread::spawn(move || {
tx2.send(1u8).unwrap();
});
handle.join().unwrap();
assert_eq!(tx1.len(), 1);Sourcepub fn capacity(&self) -> Option<usize>
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn capacity(&self) -> Option<usize>
mpmc_channel)If the channel is bounded, returns its capacity.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc;
use std::thread;
let (send, _recv) = mpmc::sync_channel(3);
let (tx1, tx2) = (send.clone(), send.clone());
assert_eq!(tx1.capacity(), Some(3));
let handle = thread::spawn(move || {
tx2.send(1u8).unwrap();
});
handle.join().unwrap();
assert_eq!(tx1.capacity(), Some(3));Sourcepub fn same_channel(&self, other: &Sender<T>) -> bool
🔬This is a nightly-only experimental API. (mpmc_channel)
pub fn same_channel(&self, other: &Sender<T>) -> bool
mpmc_channel)Returns true if senders belong to the same channel.
§Examples
#![feature(mpmc_channel)]
use std::sync::mpmc;
let (tx1, _) = mpmc::channel::<i32>();
let (tx2, _) = mpmc::channel::<i32>();
assert!(tx1.same_channel(&tx1));
assert!(!tx1.same_channel(&tx2));Trait Implementations§
impl<T> RefUnwindSafe for Sender<T>
impl<T> Send for Sender<T>where
T: Send,
impl<T> Sync for Sender<T>where
T: Send,
impl<T> UnwindSafe for Sender<T>
Auto Trait Implementations§
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.