Вызов package_receiver.next () определяется как:
pub trait DataLinkReceiver: Send {
fn next(&mut self) -> Result<&[u8]>;
}
И mspc :: Sender определяет send как:
pub fn send(&self, t: T) -> Result<(), SendError<T>>
Итак package_receiver.next () возвращает результат, содержащий ссылку на фрагмент байтов, & [u8] .Поэтому, когда вы вызываете sender.send (package); , это говорит о том, что вы хотите отправить ссылку на другой поток.Однако область соответствия для package_receiver.next () не обещает, что ссылка будет жить дольше, чем конец области.Таким образом, другой поток не может быть гарантирован, что ссылка все еще действительна во время доступа к этим данным.
str работает, потому что это статическая строка времени жизни.Эта память всегда будет действительной для чтения независимо от того, какой поток ее читает.
Если вы измените свой вызов на:
sender.send(Vec::from(packet))
Это создает переменную Vec, копирует фрагмент пакета в новыйпамяти, затем передает владение этой переменной другому потоку.Это гарантирует, что другой принимающий поток всегда будет иметь свободный доступ к этим данным.Поскольку владение явно передается, код в принимающем потоке известен компилятору как место, где заканчивается время жизни полученных переменных Vec.
Также будут некоторые разные ошибки при использовании результата .send () о котором можно позаботиться примерно так:
if sender.send(Vec::from(packet)).is_err() {
println!("Send error");
}