rust编程语言入门之无畏并发(代码片段)

小乔的博客 小乔的博客     2023-04-19     601

关键词:

无畏并发

并发

  • Concurrent:程序的不同部分之间独立的执行(并发)
  • Parallel:程序的不同部分同时运行(并行)
  • Rust无畏并发:允许你编写没有细微Bug的代码,并在不引入新Bug的情况下易于重构
  • 注意:本文中的”并发“泛指 concurrent 和 parallel

一、使用线程同时运行代码(多线程)

进程与线程

  • 在大部分OS里,代码运行在进程(process)中,OS同时管理多个进程。
  • 在你的程序里,各独立部分可以同时运行,运行这些独立部分的就是线程(thread)
  • 多线程运行:
    • 提升性能表现
    • 增加复杂性:无法保障各线程的执行顺序

多线程可导致的问题

  • 竞争状态,线程以不一致的顺序访问数据或资源
  • 死锁,两个线程彼此等待对方使用完所持有的资源,线程无法继续
  • 只在某些情况下发生的 Bug,很难可靠地复制现象和修复

实现线程的方式

  • 通过调用OS的API来创建线程:1:1模型
    • 需要较小的运行时
  • 语言自己实现的线程(绿色线程):M:N模型
    • 需要更大的运行时
  • Rust:需要权衡运行时的支持
  • Rust标准库仅提供1:1模型的线程

通过 spawn 创建新线程

  • 通过 thread::spawn 函数可以创建新线程:
    • 参数:一个闭包(在新线程里运行的代码)
➜ cd rust

~/rust
➜ cargo new thread_demo
     Created binary (application) `thread_demo` package

~/rust
➜ cd thread_demo

thread_demo on  master [?] via 

rust编程语言入门之编写自动化测试(代码片段)

编写自动化测试一、编写和运行测试测试(函数)测试:函数验证非测试代码的功能是否和预期一致测试函数体(通常)执行的3个操作:准备数据/状态运行被测试的代码断言(Assert)结果解剖测试函数测试函数需要使用test属性... 查看详情

rust编程语言入门之rust的面向对象编程特性(代码片段)

...向对象编程特性一、面向对象语言的特性Rust是面向对象编程语言吗?Rust受到多种编程范式的影响,包括面向对象面向对象通常包含以下特性:命名对象、封装、继承对象包含数据和行为“设计模式四人帮”在《设计模型》中给... 查看详情

rust编程语言入门之函数式语言特性:-迭代器和闭包(代码片段)

函数式语言特性:-迭代器和闭包本章内容闭包(closures)迭代器(iterators)优化改善12章的实例项目讨论闭包和迭代器的运行时性能一、闭包(1)-使用闭包创建抽象行为什么是闭包(closure)闭包:可以捕获其所在环境的匿名函数... 查看详情

rust编程语言入门之cargocrates.io(代码片段)

cargo、crates.io本章内容通过releaseprofile来自定义构建在https://crates.io/上发布库通过workspaces组织大工程从https://crates.io/来安装库使用自定义命令扩展cargo一、通过releaseprofile来自定义构建releaseprofile(发布配置)releaseprofile:是预定... 查看详情

rust编程语言入门之高级特性(代码片段)

高级特性主要内容不安全Rust高级Trait高级类型高级函数和闭包宏一、不安全Rust匹配命名变量隐藏着第二个语言,它没有强制内存安全保证:UnsafeRust(不安全的Rust)和普通的Rust一样,但提供了额外的“超能力”UnsafeRust存在的原... 查看详情

rust编程语言入门之最后的项目:多线程web服务器(代码片段)

最后的项目:多线程Web服务器构建多线程Web服务器在socket上监听TCP连接解析少量的HTTP请求创建一个合适的HTTP响应使用线程池改进服务器的吞吐量优雅的停机和清理注意:并不是最佳实践创建项目~/rust➜cargonewhelloCreatedbinary(applica... 查看详情

rust编程语言入门之泛型trait生命周期(代码片段)

泛型、Trait、生命周期一、提取函数消除重复fnmain()letnumber_list=vec![34,50,25,100,65];letmutlargest=number_list[0];fornumberinnumber_listifnumber>largestlargest=number;println!("Thelargestnumberis",largest);重复代码重复代码的危害:容易出错需求变更时需要在... 查看详情

rust编程语言入门之模式匹配(代码片段)

模式匹配模式模式是Rust中的一种特殊语法,用于匹配复杂和简单类型的结构将模式与匹配表达式和其他构造结合使用,可以更好地控制程序的控制流模式由以下元素(的一些组合)组成:字面值解构的数组、enum、struct和tuple变... 查看详情

rust编程语言入门之智能指针(代码片段)

智能指针智能指针(序)相关的概念指针:一个变量在内存中包含的是一个地址(指向其它数据)Rust中最常见的指针就是”引用“引用:使用&借用它指向的值没有其余开销最常见的指针类型智能指针智能指针是这样一些数据... 查看详情

flutter入门之dart中的并发编程异步和事件驱动详解(代码片段)

并发编程我们知道dart是个单线程的语言,和js一样,所以dart中不存在多线程操作,那么我们如果遇到多任务并行的场景,该如何去做呢?dart中提供了一个类似于java新线程但不能共享内存的独立运行的workerÿ... 查看详情

rust编程语言入门(代码片段)

Rust编程语言入门Rust简介为什么要用Rust?Rust是一种令人兴奋的新编程语言,它可以让每个人编写可靠且高效的软件。它可以用来替换C/C++,Rust和他们具有同样的性能,但是很多常见的bug在编译时就可以被消灭。Rust是一种通用的... 查看详情

深入浅出rust异步编程之tokio(代码片段)

深入浅出Rust异步编程之Tokio本文以tokio为例简单介绍Rust异步编程相关的一些知识。首先让我们看看为什么使用rust来进行异步编程。这里tokio官方给出了一个性能测试的对比,可以看到tokio是性能最好,实际上运行这个基准测试的... 查看详情

rust高并发编程总结(代码片段)

Serverless的概念火了,业界已经不再讨论要不要用Serverless的问题了,而是高喊ServerlessFirst的口号力求快速拥抱Serverless,无服务器并不是Serverless的本质,不需要关心服务器的情况就能高效工作,才是Serverless胜出... 查看详情

并发编程系列之callable和runnable的不同?(代码片段)

...、对比Runnable和Callable的不同ps:基于Jdk1.8看源码1、Runnable入门实例并发编程系列之Callable和Runnable的不同?在学习并发多线程的过程中,很多读者都知道怎么实现Runnable,下面是一道经典的例子publicstaticvoidmain(String[]args) Threadt=newTh... 查看详情

并发编程系列之callable和runnable的不同?(代码片段)

...比Runnable和Callable的不同ps:基于Jdk1.8看源码1、Runnable入门实例并发编程系列之Callable和Runnable的不同?在学习并发多线程的过程中,很多读者都知道怎么实现Runnable,下面是一道经 查看详情

rust初识及rust的esapi(代码片段)

RustRust是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust在语法上和C++类似,但是设计者想要在保证性能的同时提供更好的内存安全。Rust致力... 查看详情

并发编程系列之线程基础知识回顾(代码片段)

...程的一些比较重要而且比较基础的知识点,帮忙读者入门,注意只是学习并发编程的一些基础点,要系统学习的是需要多看看书籍还是花不少时间整理的。本博客是在参加培训后做的笔记,仅供学习参考问题1、使... 查看详情

rust入门基础单向链表(代码片段)

使用Rust完成单向链表    最近闲下来了,看到一门语言Rust兴起,工资也可观,linux听说有部分也开始用rust写了,但听说学习有曲线,当时本人是不信邪的,学了之后才知道是真的有曲线。。。光是链表... 查看详情