Rust 程序设计语言简体中文版这个功能。通常也不需要禁用 drop ;整个 Drop trait 存在的意义在于其是自动处理的。然而,有时你可能需要提早清理某个值。一个例 子是当使用智能指针管理锁时;你可能希望强制运行 drop 方法来释放锁以便作用域中的其他 代码可以获取锁。Rust 并不允许我们主动调用 Drop trait 的 drop 方法;当我们希望在作用 域结束之前就强制释放变量的话,我们应该使用的是由标准库提供的 些所有权。作为一个例子,让我们看看互斥器,一个更为常见的共享内存并发原语。 互斥器一次只允许一个线程访问数据 互斥器(mutex)是 mutual exclusion 的缩写,也就是说,任意时刻,其只允许一个线程访问 某些数据。为了访问互斥器中的数据,线程首先需要通过获取互斥器的 锁(lock)来表明其希 望访问数据。锁是一个作为互斥器一部分的数据结构,它记录谁有数据的排他访问权。因此, 我们描述互斥器为通过锁系统 保护(guarding)其数据。 保护(guarding)其数据。 互斥器以难以使用著称,因为你不得不记住: 1. 在使用数据之前尝试获取锁。 2. 处理完被互斥器所保护的数据之后,必须解锁数据,这样其他线程才能够获取锁。 作为一个现实中互斥器的例子,想象一下在某个会议的一次小组座谈会中,只有一个麦克风。 如果一位成员要发言,他必须请求或表示希望使用麦克风。一旦得到了麦克风,他可以畅所欲 言,然后将麦克风交给下一位希望讲话的成员0 码力 | 600 页 | 12.99 MB | 1 年前3
Rust 程序设计语言 简体中文版 1.85.0指向的堆空间。 在其他一些语言中的某些类型,我们不得不记住在每次使用完那些类型的智能指针实例后调用 清理内存或资源的代码。常见示例包括文件句柄(file handles)、套接字(sockets)和锁 (locks)。如果忘记的话,运行代码的系统可能会因为负荷过重而崩溃。在 Rust 中,可以指定 每当值离开作用域时被执行的代码,编译器会自动插入这些代码。于是我们就不需要在程序中 到处编写在实例结束时清理这些变量的代码 功能并不是一件容易的事。通常也不需要禁用 drop ;整个 Drop trait 存在的意义在于其是自动处理的。然而,有时你可能需要提早清理某个值。一个例子是当 使用智能指针管理锁时;你可能希望强制运行 drop 方法来释放锁以便作用域中的其他代码可 以获取锁。Rust 并不允许我们主动调用 Drop trait 的 drop 方法;当我们希望在作用域结束之 前就强制释放变量的话,我们应该使用的是由标准库提供的 std::mem::drop 助:举 个例子,让我们来看看互斥器(mutexes),较为常见的共享内存并发原语之一。 使用互斥器实现同一时刻只允许一个线程访问数据 互斥器(mutex)是互相排斥(mutual exclusion)的缩写,因为在同一时刻,它只允许一个 线程访问数据。为了访问互斥器中的数据,线程首先需要通过获取互斥器的锁(lock)来表明 其希望访问数据。锁是一个数据结构,作为互斥器的一部分,它记录谁有数据的专属访问权。0 码力 | 562 页 | 3.23 MB | 26 天前3
Comprehensive Rust(简体中文) 20241261.1 Arc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 61.2 互斥器(Mutex) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 8 61.3 示例 . . . • 裸机:为期一天的课程,介绍如何使用 Rust 进行裸机(嵌入式)开发。课程内容涵盖微控制器和应用 处理器。 • 并发:为期一天的课程,介绍 Rust 中的并发性。我们将涵盖传统并发(使用线程和互斥锁进行抢占 式调度)和 async/await 并发(使用 futures 进行协作式多任务处理)。 非目标 Rust 是一门庞大的语言,短短几天的课程无法覆盖其全部内容。本课程不包括以下内容: 有一些独特的卖点: 23 • 内存安全:在编译时可防止所有类内存 bug – 不存在未初始化的变量。 – 不存在“双重释放”。 – 不存在“释放后使用”。 – 不存在 NULL 指针。 – 不存在被遗忘的互斥锁。 – 不存在线程之间的数据竞争。 – 不存在迭代器失效。 • 没有未定 的运行 行 :每个 Rust 语句的行为都有明确定义 – 数组访问有边界检查。 – 整数溢出有明确定义(panic 或回绕)。0 码力 | 359 页 | 1.33 MB | 10 月前3
Rust 语言学习笔记7.5.1 控制访问顺序--等待与通知 ................................................... 103 7.5.2 控制访问顺序的机制-原子类型与锁 ........................................ 104 7.6 并行 ............................................. 具体内容需要查看闭包的可变借用。 3.2 引用和借用 所有权系统允许我们通过“Borrowing”的方式达到这个目的。这个机制非常像 其他编程语言中的“读写锁”,即同一时刻,只能拥有一个“写锁”,或只能 拥有多个“读锁”,不允许“写锁”和“读锁”在同一时刻同时出现。当然这 也是数据读写过程中保障一致性的典型做法。只不过 Rust 是在编译中完成这个 (Borrowing)检查的,而不是在运行时,这也就是为什么其他语言程序在运行过 包裹起来的类型对象,对可变性没有要求,可以搭配 mutex 或者 RWLock 进行修改; 3.一旦最后一个拥有者消失,则资源会被自动回收,这个生命周期是在编译期 就确定下来的(如果搭配了锁的使用怎么确定?引入 mutex 可能会造成死 锁。); 4.Arc 实际上是一个指针,它不影响包裹对象的方法调用形式(即不存在先解 开包裹再调用值这一说); Arc 对于多线程的共享状态几乎是必须的(减少复制,提高性能)0 码力 | 117 页 | 2.24 MB | 1 年前3
Comprehensive Rust(繁体中文)明如何使用 Rust 在 bare-metal (嵌入式系統) 上台開發。課程 內容包含微控制器和處理器。 • 並行:這個全天課程著重於 Rust 中的並行問題。我們將探討傳統並行 (使用執行緒和互斥鎖進行先 占式排程) 以及 async/await 並行 (使用 future 進行合作多工處理)。 非課程目標 Rust 是大型的程式語言,無法在幾天內就介紹完畢。因此,本課程不包含下列內容: 「編譯期的記憶體安全性」- 在編譯期間就能避免各類記憶體錯誤 – 不會產生未初始化的變數。 – 不會導致重複釋放記憶體。 – 不會使用已釋放的記憶體。 – 不會產生 NULL 指標。 – 不會產生忘記鎖定的互斥鎖。 – 執行緒之間不會發生資料競爭。 – 不會發生疊代器無效的情形。 • 「不會出現未定義的執行階段行為 (undefined runtime behavior)」- Rust 陳述式的行為一律會 *counter.lock() += 2; println!("count: {}", counter.lock()); } • 如果在中斷處理常式使用了鎖,請務必小心避免死結。 • spin 也具備排號自旋鎖互斥實作項目;std::sync 中 RwLock、Barrier 和 Once 的同等項 目;以及用於延遲初始化的 Lazy。 • once_cell Crate 也具備一些實用型別,適合用於晚期初始化,與0 码力 | 358 页 | 1.41 MB | 10 月前3
Comprehensive Rust(繁体中文) 202406明如何使用 Rust 在 bare-metal (嵌入式系統) 上台開發。課程 內容包含微控制器和處理器。 • 並行:這個全天課程著重於 Rust 中的並行問題。我們將探討傳統並行 (使用執行緒和互斥鎖進行先 占式排程) 以及 async/await 並行 (使用 future 進行合作多工處理)。 非課程目標 Rust 是大型的程式語言,無法在幾天內就介紹完畢。因此,本課程不包含下列內容: 「編譯期的記憶體安全性」- 在編譯期間就能避免各類記憶體錯誤 – 不會產生未初始化的變數。 – 不會導致重複釋放記憶體。 – 不會使用已釋放的記憶體。 – 不會產生 NULL 指標。 – 不會產生忘記鎖定的互斥鎖。 – 執行緒之間不會發生資料競爭。 – 不會發生疊代器無效的情形。 • 「不會出現未定義的執行階段行為 (undefined runtime behavior)」- Rust 陳述式的行為一律會 *counter.lock() += 2; println!("count: {}", counter.lock()); } • 如果在中斷處理常式使用了鎖,請務必小心避免死結。 • spin 也具備排號自旋鎖互斥實作項目;std::sync 中 RwLock、Barrier 和 Once 的同等項 目;以及用於延遲初始化的 Lazy。 • once_cell Crate 也具備一些實用型別,適合用於晚期初始化,與0 码力 | 356 页 | 1.41 MB | 1 年前3
尝试用RUST写教学操作系统检查ownership / buffer overflow -> 缓冲区溢出不会导致system compromise • 并发安全: 对于全局变量, 它自带一个锁. 访问全局变 量的过程必须取得锁 -> C里面全局变量和锁时分离 的, 时常会忘记加锁,当锁离开作用域时自动释放, 防 止造成死锁 • Rust 提供了unsafe 这种块能够做不安全但必须的事 情如指针算术. 但不安全的代码越少越好0 码力 | 23 页 | 1.53 MB | 1 年前3
Real world Rust
- Why and how we use Rust in TiKV一个变量,可以同时进行多个 immutable 的 borrow,但 只允许一个 mutable 的 borrow ● 这个其实跟 read-write lock 很相似,同时允许多个读锁, 但一次只允许一个写锁 Lifetime struct A<'a> { b: &'a u32 } fn main() { let b = 10; let mut a = A{ b: 的类型推导系统和编译检查跨线程传递和共享的对象 是否满足 Send + Sync TiKV ● 大规模分布式 Key-Value 数据库 ● 支持 ACID 跨行事务支持 ● 支持 MVCC 无锁的快照读 ● 构建于 Raft 之上,不依赖分布式文件系统 ○ 更少的第三方依赖 ○ 更高的性能(低延迟) ● 配合 TiDB 使用,需要有健全的逻辑实现 SQL 层的下推算子 TiKV0 码力 | 29 页 | 506.53 KB | 1 年前3
Rust分布式账务系统 - 胡宇● 稳定的底层 API ● 灵活的顶层 API ● 树状结构 ● 聚合查询 ● 正确性:内存安全,线程安全 ● 可靠性: Raft 共识算法 raft-rs ● 高性能:关键路径无锁单线程 顶层架构 ● Gateway 路由层 ○ 业务 API 到底层 API 的翻 译 ○ 产生转账计划 ● Marker 事务层 ○ 使用业务 id 进行路由 ○ 执行转账计划 ○ 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ● 3. 处理被共识的 events ,更新状态机 (账户表) ○ 去重 & 更新余额 ○ 关键路径采用无锁单线程 账户层: Auticuro 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events0 码力 | 27 页 | 12.60 MB | 1 年前3
基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺blocking code Tokio - Notes • 使用非阻塞或并发 / 异步数据结构 • 使用异步锁和异步 Channel 。 • 使用 spawn_blocking 提交耗时任务 • C FFI 调用时,要关注上下文的线程安全性。 • 多个运行时之间使用 Channel 通信,降低锁使用范围。 Tokio - Graceful Stop • futures::future::Abortable0 码力 | 29 页 | 2.26 MB | 1 年前3
共 13 条
- 1
- 2













