在循环中使用send() (mpsc::Sender)



我是Rust新手,如果这个问题看起来不合适或者很愚蠢,请原谅。

我正在尝试从TCP流stream读取数据,并通过使用let (sender_buff, receiver_buff) = ::std::sync::mpsc::channel();将其发送到另一个线程。

下面是我的代码:
const FRAME_SIZE:usize = 256;
let mut raw_bytes = [0 as u8; FRAME_SIZE];
let mut time_out = false;
while !time_out {
if stream.read_exact(&mut raw_bytes).is_ok() {
// send in the channel
sender_buff.send(&mut raw_bytes).ok();
} 

但是它不编译:

error[E0499]: cannot borrow `raw_bytes` as mutable more than once at a time

我不知道如何解决这个问题,有什么想法吗?谢谢你。

你要做的是发送一个&mut引用到缓冲区,这不是一个很好的主意。

为了方便讨论,假设rust允许这样做:

  1. 该缓冲区是堆栈分配的,因此一旦退出该函数,接收方将有一个指向未初始化内存的指针,即UB
  2. 该函数可能在接收方仍在读取缓冲区时覆盖该缓冲区-这也会导致应用程序中难以检测的错误。

rust保护您避免这两种错误。

您需要做的是使用堆分配的缓冲区(Vec<T>),并发送缓冲区本身而不是引用。这将迫使您在每次迭代中创建一个新的缓冲区,因为move语义,这将保护您免受(2)