From 2e5e1d257c04656d69f910056dfefa45d451174a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=8F=9C13?= <38740836+fyhhub@users.noreply.github.com> Date: Sun, 12 Nov 2023 16:57:51 +0800 Subject: [PATCH] =?UTF-8?q?Update=205.=E5=A4=9A=E7=BA=BF=E7=A8=8B=E9=80=9A?= =?UTF-8?q?=E4=BF=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\250\213\351\200\232\344\277\241.md" | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) 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)` 可以关闭通道