菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

三个线程轮流打印 1-100

原创
05/13 14:22
阅读数 816
use std::sync::mpsc;
use std::thread;

fn main() {
    let (s1, r1) = mpsc::channel::<usize>(); // s1 告诉下个线程打印 3N+1 , r1 接收 3N+1 的打印数字
    let (s2, r2) = mpsc::channel::<usize>(); // s2 告诉下个线程打印 3N+2 , r2 接收 3N+2 的打印数字
    let (s3, r3) = mpsc::channel::<usize>(); // s3 告诉下个线程打印 3N+3 , r3 接收 3N+3 的打印数字

    const MAX_PINRT: usize = 100;

    thread::spawn(move || {
        let id = thread::current().id();
        loop {
            if let Ok(message) = r2.recv() {
                println!("thread {:?} print: {}", id, message);
                if message < MAX_PINRT {
                    s3.send(message + 1).unwrap();
                } else {
                    break;              //       打印完成退出
                }
            } else {
                break;                  //       输出完成退出 
            }
        }
    });

    thread::spawn(move || {
        let id = thread::current().id();
        for val in r3 {
            println!("thread {:?} print: {}", id, val);
            if val < MAX_PINRT {
                s1.send(val + 1).unwrap();
            } else {
                break;
            }
        }
    });
    let id = thread::current().id();
    s2.send(1).unwrap();
    for val in r1 {
        println!("thread {:?} print: {}", id, val);
        if val < MAX_PINRT {
            s2.send(val + 1).unwrap();
        } else {
            break;
        }
    }
}

发表评论

0/200
0 点赞
0 评论
收藏
为你推荐 换一批