首页 > 其他分享 >rust 多线程

rust 多线程

时间:2023-09-09 20:00:23浏览次数:34  
标签:name thread unwrap raw let usr 多线程 rust

多线程之间的通信和内存共享常见方式

use std::sync::mpsc;
use std::thread;
use std::sync::{Arc,Mutex};

struct User {
    name: String
}

fn main() {

    // Arc 通过共享内存 在线程间通信  数据不可修改(所以这里使用的不可变引用)
    let usr_raw = Arc::new(User{ name: "Bob".to_string()});
    let usr = usr_raw.clone();
    let t1 = thread::spawn(move ||{
        println!("name :{}",&usr.name);
    });
    let usr = usr_raw.clone();
    let t2 = thread::spawn(move ||{
        println!("name :{}",&usr.name);
    });

    t1.join().unwrap();
    t2.join().unwrap();

    
    // 通过共享内存 在线程间通信  数据可修改,Mutex保证了数据可在线程间被安全的修改(一次只被一个线程修改)
    let raw = Arc::new(Mutex::new(0));
    let mut handle = vec![];
    for i in 0..5 {
        let raw = Arc::clone(&raw);
        let h = thread::spawn(move || {
            println!("thread :{}", i );
            *raw.lock().unwrap() += 1;
        });
        handle.push(h);
    }

    for i in handle {
        i.join().unwrap();
    }
    print!("{}",raw.lock().unwrap());


    // 通过通信 在线程间共享数据
    let (tx,rx) = mpsc::channel();
    let tx2 = mpsc::Sender::clone(&tx); //     let tx2 = tx.clone();
    thread::spawn(move || {
        let df = vec!["java","perl","python"];
        for i in df {
            println!("tx2 send {}",i);
            tx2.send(i).unwrap();
        }
    });

    thread::spawn(move || {
        let df = vec!["java","c","cpp","rust"];
        for i in df {
            println!("tx send {}",i);
            tx.send(i).unwrap();
        }
    });

    for ret in rx {
        println!("tx recv : {}", ret);
    }

}

标签:name,thread,unwrap,raw,let,usr,多线程,rust
From: https://www.cnblogs.com/mmtinfo/p/17690075.html

相关文章

  • C++多线程编程:包括多线程打印ABC、线程池实现等等
    #include<iostream>#include<thread>#include<mutex>#include<condition_variable>std::condition_variablecond;std::mutexprint_mutex;intflag=0;voidprint_thread(intnum){for(inti=0;i<10;i++)//循环{......
  • 线程安全的队列:使用Monitor模式和C++11多线程库
    线程安全的队列:使用Monitor模式和C++11多线程库引言在多线程编程中,数据共享是一个关键的问题。如果多个线程需要访问同一个数据结构,不正确的管理会导致数据不一致甚至程序崩溃。本文将介绍如何使用C++11的多线程库和Monitor模式来实现一个线程安全的队列。Monitor模式Monitor模式......
  • 文盘Rust——子命令提示,提高用户体验
    上次我们聊到CLI的领域交互模式。在领域交互模式中,可能存在多层次的子命令。在使用过程中如果全评记忆的话,命令少还好,多了真心记不住。频繁--help也是个很麻烦的事情。如果每次按'tab'键就可以提示或补齐命令是不是很方便呢。这一节我们就来说说'autocommplete'如何实现。......
  • RustDesk 远程桌面 1.2.2 发布
    导读RustDesk项目发布v1.2.2版本,增加独立窗口连接模式,改进响应效果,修复了一些bug,访问下载体验。升级内容1.增加独立窗口连接模式默认依然是Tab模式,用户可以在设置里修改为独立窗口模式,也可以在建立连接后分离为独立窗口模式,未来会增加drag+drop能力,期望实现......
  • std list多线程使用
    #include<iostream>#include<list>#include<thread>#include<mutex>#include<condition_variable>#include<unistd.h>std::list<int>my_list;std::mutexmy_mutex;std::condition_variablemy_cond;voidadd_ele......
  • Rust项目使用Dockerfile构建镜像 访问crates.io下载速度慢解决
    在$CARGO_HOME/config文件添加国内的镜像源下面的镜像源来自:https://rsproxy.cn/FROMrust:1.72asbuilderWORKDIR/usr/srcCOPY..RUNecho"[source.crates-io]\n\replace-with='rsproxy-sparse'\n\[source.rsproxy]\n\registry=\"https://rs......
  • Heritrix的多线程ToeThread和ToePool
    4、Heritrix的多线程ToeThread和ToePool要想更有效更快捷地抓取网页内容,则必须采用多线程。Heritirx提供了一个标准的线程池ToeThread,用于管理所有的抓取线程。org.archive.crawler.frameworkClassToePooljava.lang.Objectjava.lang.ThreadGrouporg.archi......
  • 杰哥教你面试之一百问系列:java中高级多线程concurrent的使用
    目录问题1:什么是ConcurrentHashMap?它与HashMap的区别是什么?问题2:什么是CopyOnWriteArrayList?它适用于什么样的场景?问题3:什么是BlockingQueue?它的作用是什么?举例说明一个使用场景。问题4:什么是Semaphore?它如何控制并发访问?问题5:什么是CountDownLatch?它适用于什么场景?问题6:什么是Cyc......
  • java多线程几个方法的基本概念
    一、run()和start()这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.二、关键字Synchronized这个关键字用于保护共享数据,当然......
  • 关于多线程的相关概念
    多线程多线程的好处多线程可以提高CPU的使用效率比如单线程运行时遇到网络等待的耗时操作时,只能乖乖的等待,且交互终端但是多线程的情况下,一个线程负责交互,另一个负责计算线程的访问权限知道哪些数据是线程私有,哪些变量是线程之间共享数据线程调度和优先级当线程数量......