首页 > 其他分享 >28_rust_无畏并发

28_rust_无畏并发

时间:2023-11-18 17:12:55浏览次数:27  
标签:spawn join thread 28 无畏 线程 sleep main rust

无畏并发

Concurrent:程序不同部分之间独立执行;
Parallel:程序不同部分同时运行。

rust无畏并发:允许编写没有细微Bug的代码。并在不引入新Bug的情况下易于重构。这里所说的“并发”泛指concurrent和parallel。

使用线程同时运行代码

1:1模型:实现线程的方式:通过调用OS的API创建线程。只需较小的运行时。
M:N模型:语言自己实现的线程(绿色线程),需要更大的运行时。
rust:需要权衡运行时的支持,希望尽可能小的运行时支持。rust标准库仅提供1:1模型的线程。

通过spawn创建新线程
通过thread::spawn函数可创建新线程,参数是一个闭包(即在新线程里运行的代码)。
thread::sleep可让当前线程暂停执行。

use std::thread;
use std::time::Duration;

fn main() {
    thread::spawn(|| {
      for i in 1..10 {
          println!("spawn thread {}", i);
          thread::sleep(Duration::from_millis(1));
      }
    });
    for i in 1..5 {
        println!("main thread {}", i);
        thread::sleep(Duration::from_millis(1));// sleep 1ms
    }
}
/* 输出结果
main thread 1
spawn thread 1
main thread 2
spawn thread 2
spawn thread 3
main thread 3
main thread 4
spawn thread 4
*/

可看出,主线程结束时,子线程也结束。
通过join Handle来等待所有线程完成
thread::spawn函数返回值类型时JoinHandle,JoinHandle持有值的所有权。调用join方法,可等待对应其它线程完成。

  • join方法:调用handle的join方法会阻止当前运行线程的执行,直到handle所表示的这些线程终结。
use std::thread;
use std::time::Duration;

fn main() {
    let handle = thread::spawn(|| {
      for i in 1..10 {
          println!("spawn thread {}", i);
          thread::sleep(Duration::from_millis(1));
      }
    });
    for i in 1..5 {
        println!("main thread {}", i);
        thread::sleep(Duration::from_millis(1));// sleep 1ms
    }
    handle.join().unwrap(); // 会阻止主线程执行,直到子线程结束 
}
/*输出
main thread 1
spawn thread 1
spawn thread 2
main thread 2
spawn thread 3
spawn thread 4
main thread 3
main thread 4
spawn thread 5
spawn thread 6
spawn thread 7
spawn thread 8
spawn thread 9
*/

如果将handle.join().unwrap()提前到主函数的打印之前,可看到主函数的打印会在子线程执行完之后。

标签:spawn,join,thread,28,无畏,线程,sleep,main,rust
From: https://www.cnblogs.com/UFO-blogs/p/17840749.html

相关文章

  • rust程序设计(4)关于 trait | impl 相关的概念和疑问
    trait是什么?Rust中的trait是一种定义可被多种类型实现的共享行为的方式。它类似于Java或C#中的接口。通过trait,你可以定义一组方法签名(有时包括默认实现),不同的类型可以实现这些方法。这有助于抽象通用功能并确保不同类型间一定程度的一致性。当一个类型实现了一个trait,它承诺提......
  • AtCoder Beginner Contest 328
    B-11/11题意是:有n个月份,要你计算出月份上的每个数位与对应月份中的每个日期数位一致的日期和直接模拟即可usingnamespacestd;inta[200];intp;boolcheck(intx){ p=x%10; x/=10; while(x){ intq=x%10; if(q!=p)returnfalse; x/=10; } returntrue;}boo......
  • 20211128《信息安全系统设计与实现》第12章学习笔记
    一、任务内容自学教材第12章,提交学习笔记(10分)1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核心是要求GPT:“请你以苏格......
  • Windows rustup update 速度慢,使用字节跳动Rust镜像加速
    不设置镜像加速rustup更新升级会非常慢RsProxy字节跳动的Rust镜像 Windows想要使用这个镜像需要按照官方提示去设置两个系统变量分别为 RUSTUP_DIST_SERVER RUSTUP_UPDATE_ROOT 之后来到当前用户文件夹下修改cargo的配置文件(没有就创建一个)C:\Users\你PC名\.c......
  • @各大高校|亚洲诚信TrustAsia接入CARSI,四大福利活动重磅来袭!
    亚洲诚信TrustAsiaEduPKI在CARSI平台正式上线,为广大CARSI成员校师生提供SSL证书和专业的技术服务支持,守卫高校安全!伴随着人工智能、大数据、物联网等新一代数字化技术的迅猛发展,教育信息化2.0和智慧校园建设得到快速推进。但与此同时,勒索软件、钓鱼邮件等网络安全威胁层出不穷,这对......
  • 【题解 CF1628D2】 Game on Sum
    GameonSum(HardVersion)题面翻译Alice和Bob正在玩一个游戏,游戏分为\(n\)个回合,Alice和Bob要轮流对一个数\(x\)进行操作,已知这个数初始值是\(0\)。具体每个回合的行动规则如下:Alice选择一个在区间\([0,k]\)之间的实数\(t\)。Bob可以选择让\(x\)变成\(......
  • [ABC288D] Range Add Query
    先考虑将原序列差分一下,事实上,我们对于这类每次可以操作一个区间减去固定值的时候,我们一般都需要差分,因为差分后,我们的操作实际上相当于**在差分序列上修改两个点**,这个时候的问题是好考虑的。这时候问题转化为,我们每次可以选择两个距离恰好为$k+1$的点,将$l$加上$w$,将$l......
  • esp32笔记[10]-rust驱动ssd1306显示屏
    摘要使用rust(no-std)环境和esp-hal库实现SSD1306显示屏(128x64)显示bmp图片.平台信息esp32(模组:ESP32-WROOM-32D)(xtensalx6)(xtensa-esp32-none-elf)rust超链接esp32笔记[7]-使用rust+zig开发入门原理简介rust的include_bytes!宏Rust的include_bytes!宏可以用......
  • 【漏洞复现】JumpServer伪随机密码重置漏洞[CVE-2023-42820]
    Jumperver是飞致云公司(https://www.jumpserver.org)旗下开源的堡垒机,是国内最受欢迎的开源堡垒机之一。小编也经常使用,也介绍给一些运维的客户使用,简直是运维神器。2023年9月爆出CVE-2023-42820造成任意用户密码重置漏洞。大概就是Jumpserver的一个第三方库django-simp......
  • abc280F - Pay or Receive(判断是否全为零环)
    https://atcoder.jp/contests/abc280/tasks/abc280_f对于每一个连通块单独处理,首先判断是否全为0环,可以用bfs判断。从一个点出发计算其他点到它的最短距离,如果存在一个不唯一,说明存在非零环。然后计算距离的时候直接-d[x]+d[y]即可#include<cstdio>#include<algorithm>#incl......