Rust 中 `.lock()` 的作用


Rust 中 .lock() 的作用

.lock() 是用于获取互斥锁(Mutex)的方法,在并发编程中起关键作用。

主要功能

  1. 线程同步:确保同一时间只有一个线程可以访问被保护的数据
  2. 数据安全:防止多个线程同时修改共享数据导致的竞争条件
  3. 内存安全:保证在多线程环境下的内存访问安全

工作原理

// Mutex<T> 的基本使用模式
use std::sync::Mutex;
let data = Mutex::new(vec![1, 2, 3]);
{
    let mut guard = data.lock().unwrap(); // 获取锁
    guard.push(4); // 修改数据
    // guard 离开作用域时自动释放锁
}

在代码中

let conn = data.db.conn.lock().unwrap();

这行代码的作用是:

  1. data.db.conn 是一个 Mutex<T> 类型的数据库连接池
  2. .lock() 尝试获取互斥锁
  3. 如果获取成功,返回一个 MutexGuard
  4. 如果获取失败(极少见的情况),unwrap() 会 panic

为什么需要锁

在 Web 应用中,多个请求可能同时访问数据库连接:

// 多个并发请求可能同时执行
async fn request1() {
    let conn = data.db.conn.lock().unwrap(); // 请求1获取锁
    // 执行数据库操作...
} // 锁在这里释放
async fn request2() {
    let conn = data.db.conn.lock().unwrap(); // 请求2等待锁释放后才能获取
    // 执行数据库操作...
}

Python 中的类似概念

Python 中的 threading.Lock 提供类似功能:

import threading
# 共享资源保护
shared_data = []
data_lock = threading.Lock()
def access_shared_data():
    with data_lock:  # 获取锁
        shared_data.append(42)  # 操作共享数据
        # 离开 with 块时自动释放锁
# 或者手动获取/释放锁
def manual_lock_access():
    data_lock.acquire()
    try:
        shared_data.append(42)
    finally:
        data_lock.release()  # 必须手动释放

Rust vs Python 的区别

特性Rust MutexPython Lock
编译时检查有,所有权系统保证正确使用无,依赖运行时检查
自动释放RAII,guard 离开作用域自动释放需要手动释放或使用 with 语句
错误处理Result 类型,必须处理获取锁失败可能死锁,需要手动处理
性能零成本抽象有一定运行时开销

在你的应用中的意义

由于 Actix-web 是异步框架,多个请求可能并发访问数据库连接池,使用 Mutex 确保了:

  1. 同一时间只有一个请求可以使用数据库连接
  2. 防止数据库连接竞争导致的问题
  3. 保证数据一致性

声明:一代明君的小屋|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Rust 中 `.lock()` 的作用


欢迎来到我的小屋