diff --git "a/src/rust-learn/5.\345\244\232\347\272\277\347\250\213\351\200\232\344\277\241.md" "b/src/rust-learn/5.\345\244\232\347\272\277\347\250\213\351\200\232\344\277\241.md" index a2f318dbfb..d4e253a6d9 100644 --- "a/src/rust-learn/5.\345\244\232\347\272\277\347\250\213\351\200\232\344\277\241.md" +++ "b/src/rust-learn/5.\345\244\232\347\272\277\347\250\213\351\200\232\344\277\241.md" @@ -26,7 +26,26 @@ fn main() { + **接收消息的操作rx.recv()会阻塞当前线程,直到读取到值,或者通道被关闭** + **需要使用move将tx的所有权转移到子线程的闭包中** -## 二、传输具有所有权的数据 +## 二、多发送者,多接收者 +```rust +use std::{sync::{Arc, Weak, Barrier, mpsc}, cell::RefCell, thread::{self, JoinHandle}, time::Duration}; + + +fn main() { + let (p, s) = mpsc::channel(); + let handle = thread::spawn(move || { + p.send("你好").unwrap(); + p.send("你好1").unwrap(); + }); + + + println!("主线程接收:{}", s.recv().unwrap()); + println!("主线程接收:{}", s.recv().unwrap()); + println!("主线程结束"); +} +``` + +## 三、传输具有所有权的数据 ```rust use std::sync::mpsc; use std::thread; @@ -50,7 +69,7 @@ fn main() { 也就是说发送的数据,需要实现`Copy`特征 -## 三、使用多发送者 +## 四、使用多发送者 ```rust use std::sync::mpsc; use std::thread; @@ -75,7 +94,7 @@ fn main() { 如果使用多发送者,需要对发送者进行拷贝,只有这样,接受者才是同一个。否则不是同一个接收者。 -## 四、同步channel +## 五、同步channel 使用`mpsc::sync_channel`可以创建同步管道。必须等待接收到消息后,才可以继续执行: @@ -101,7 +120,7 @@ fn main() { } ``` -## 五、关闭channel +## 六、关闭channel 通道关闭的两个条件:发送者全部drop或接收者被drop,要结束for循环显然是要求发送者全部drop,但是由于send自身没有被drop,会导致该循环永远无法结束,最终主线程会一直阻塞。 -`drop(send)` 可以关闭通道 \ No newline at end of file +`drop(send)` 可以关闭通道