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); 

上述代码会在编译时报错,因为 s1 在 let 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 成为系统编程和开发高性能应用的绝佳选择。

相关推荐
噢,我明白了10 小时前
java中唯一键和幂等键的应用
java·后端
GreenTea10 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
考虑考虑10 小时前
synchronized字符串常量
java·后端·java ee
颜进强11 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
GetcharZp11 小时前
定位不再一个个吐坐标:英伟达 LocateAnything 上手全攻略
后端
郑州光合科技余经理12 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
我叫黑大帅12 小时前
Go日志库工程选型与逃逸分析评测报告
后端·面试·go
IT_陈寒15 小时前
JavaScript闭包的这个坑,我居然今天才爬出来
前端·人工智能·后端
Thneonl15 小时前
消息队列选型决策树:RabbitMQ vs Kafka vs Redis Streams
后端·架构