Skip to content

Commit

Permalink
Update 5.多线程通信.md
Browse files Browse the repository at this point in the history
  • Loading branch information
fyhhub authored Nov 12, 2023
1 parent 4024bbe commit 2e5e1d2
Showing 1 changed file with 24 additions and 5 deletions.
29 changes: 24 additions & 5 deletions src/rust-learn/5.多线程通信.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -50,7 +69,7 @@ fn main() {
也就是说发送的数据,需要实现`Copy`特征


## 、使用多发送者
## 、使用多发送者
```rust
use std::sync::mpsc;
use std::thread;
Expand All @@ -75,7 +94,7 @@ fn main() {
如果使用多发送者,需要对发送者进行拷贝,只有这样,接受者才是同一个。否则不是同一个接收者。


## 、同步channel
## 、同步channel

使用`mpsc::sync_channel`可以创建同步管道。必须等待接收到消息后,才可以继续执行:

Expand All @@ -101,7 +120,7 @@ fn main() {
}
```

## 、关闭channel
## 、关闭channel
通道关闭的两个条件:发送者全部drop或接收者被drop,要结束for循环显然是要求发送者全部drop,但是由于send自身没有被drop,会导致该循环永远无法结束,最终主线程会一直阻塞。

`drop(send)` 可以关闭通道
`drop(send)` 可以关闭通道

0 comments on commit 2e5e1d2

Please sign in to comment.