Rust 中的并发模型和所有权系统

原文链接:mp.weixin.qq.com/s/fDcClchcJ...

Rust 是一种现代编程语言,专为性能敏感和系统级开发设计。 Rust 的关键特性之一是其所有权系统,该系统赋予开发者内存安全的同时不影响性能。 此外,Rust 支持多种并发模型,使得用 Rust 策划并发爬虫或者并发 web server 成为可能。本文将深入探讨 Rust 的这些特性。

并发模型

在 Rust 里,可以通过两者方式来进行并发编程:线程模型和消息传递模型。

  1. 线程模型:Rust 的标准库提供了一套包含线程创建、锁和其他并发原语的完整工具集合。并发包 std::thread 可以轻易地创建线程以运行一个闭包,并获取其返回值。
rust 复制代码
use std::thread;
use std::time::Duration;

fn main() {
    let handle = thread::spawn(|| {
        for i in 1..10 {
            println!("hi number {} from the spawned thread!", i);
            thread::sleep(Duration::from_millis(1));
        }
    });

    for i in 1..5 {
        println!("hi number {} from the main thread!", i);
        thread::sleep(Duration::from_millis(1));
    }

    handle.join().unwrap();
}
  1. 消息传递模型:Rust 通过 std::sync::mpsc 使用了一种多生产者单消费者 (MPSC) 的消息队列模型。这种模型允许多个线程共享数据,而无需显式的同步操作。
rust 复制代码
use std::thread;
use std::sync::mpsc;

fn main() {
    let (tx, rx) = mpsc::channel();  

    thread::spawn(move || {
        let val = String::from("Hello");
        tx.send(val).unwrap();
    });

    let received = rx.recv().unwrap();
    println!("Got: {}", received);
}

所有权系统

在 Rust 中,所有权系统用于管理内存。这是通过一些规则实现的,编译器在编译时就会检查这些规则。

  1. 变量取值默认是移动语义,也就是深拷贝。这一点在处理动态内存数据结构时表现的尤为重要。例如:
rust 复制代码
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1); 

上述代码会在编译时报错,因为 s1let s2 = s1; 语句后就失去了所有权,不能再被使用。

  1. 在函数中,所有权也会被转移。
rust 复制代码
fn main() {
    let s = String::from("hello");
    takes_ownership(s);
    //`s` 的所有权已经被 `takes_ownership` 所获得,这里再使用就会编译错误
    //println!("In main: {}", s);
}

fn takes_ownership(some_string: String) {
    println!("{}", some_string);
} 

通过所有权和这两种并发模型,Rust 成为了一种有内存安全保证,性能强大的并发编程语言。并发编程并优秀的类型系统使 Rust 成为系统编程和开发高性能应用的绝佳选择。

相关推荐
喵手7 分钟前
如何利用Java的Stream API提高代码的简洁度和效率?
java·后端·java ee
掘金码甲哥13 分钟前
全网最全的跨域资源共享CORS方案分析
后端
m0_4805026421 分钟前
Rust 入门 生命周期-next2 (十九)
开发语言·后端·rust
张醒言27 分钟前
Protocol Buffers 中 optional 关键字的发展史
后端·rpc·protobuf
鹿鹿的布丁43 分钟前
通过Lua脚本多个网关循环外呼
后端
墨子白44 分钟前
application.yml 文件必须配置哇
后端
xcya1 小时前
Java ReentrantLock 核心用法
后端
用户466537015051 小时前
如何在 IntelliJ IDEA 中可视化压缩提交到生产分支
后端·github
小楓12011 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
天天摸鱼的java工程师1 小时前
Java 解析 JSON 文件:八年老开发的实战总结(从业务到代码)
java·后端·面试