Rust 学习笔记 22:共享状态并发 (Shared-State Concurrency)

Rust 学习笔记 22:共享状态并发 (Shared-State Concurrency) “Do not communicate by sharing memory; instead, share memory by communicating.” – Go Language Slogan 虽然 Go 倡导通过通信来共享内存(Channel),但 Rust 同样提供了强大的共享状态并发工具。而且得益于所有权系统,Rust 中的锁是线程安全的(Thread Safety),你很难写出有数据竞争的代码。 1. Mutex (互斥锁) Mutex (Mutual Exclusion) 让同一时刻只有一个线程访问数据。 Rust 的 Mutex 有两个特点: 必须要先获取锁,才能通过解引用访问内部数据。这保证了你如果不加锁,根本拿不到数据(编译器按头让你加锁)。 RAII:锁的释放在 Guard 离开作用域时自动发生,不需要手动 unlock。 1let m = Mutex::new(5); 2{ 3 let mut num = m.lock().unwrap(); // 获取锁,num 是 MutexGuard 4 *num = 6; // 修改数据 5} // 离开作用域,锁自动释放 2. 原子引用计数 Arc 要在多个线程间共享 Mutex,直接传是不行的(所有权规则)。 你可能会想到 Rc<T>,但 Rc 不是线程安全的。 我们需要 Arc<T> (Atomic Reference Counting)。 ...

2025-11-30 · 2 min · 223 words · 老墨

GoLang教程——并发进阶

大家好,我是极客老墨。 并发编程中,Channel 很好用,但不是万能的。有时候需要更精细的控制:等待一组任务完成、保护共享数据、限制并发数量。这时候就需要 sync 包的同步工具了。 这篇就聊聊 Go 的并发进阶工具,看看它们各自适合什么场景。 WaitGroup:等待组 WaitGroup 用于等待一组 Goroutine 完成,是最常用的同步工具。 基本用法 1import ( 2 "fmt" 3 "sync" 4 "time" 5) 6 7func worker(id int, wg *sync.WaitGroup) { 8 defer wg.Done() // 完成时调用 9 10 fmt.Printf("Worker %d starting\n", id) 11 time.Sleep(time.Second) 12 fmt.Printf("Worker %d done\n", id) 13} 14 15func main() { 16 var wg sync.WaitGroup 17 18 for i := 1; i <= 5; i++ { 19 wg.Add(1) // 增加计数 20 go worker(i, &wg) 21 } 22 23 wg.Wait() // 等待所有完成 24 fmt.Println("All workers completed") 25} 要点: ...

2024-12-05 · 9 min · 1714 words · 老墨