备注

AI Translation Notice

This document was automatically translated by hunyuan-turbos-latest model, for reference only.

  • Source document: kernel/locking/mutex.md

  • Translation time: 2026-01-13 12:51:18

  • Translation model: hunyuan-turbos-latest

Please report issues via Community Channel

备注

Author: Long Jin longjin@RinGoTek.cn

mutex (Mutual Exclusion Lock)

  A mutex is a lightweight synchronization primitive that has only two states: locked or free.

  When a mutex is held, any process attempting to lock it will be put to sleep until the resource becomes available.

1. Features

  • Only one task can hold the mutex at any given time

  • Does not allow recursive locking/unlocking

  • Can only be manipulated through the mutex’s API

  • Cannot be used in hard interrupts or soft interrupts

2. Definition

  The mutex is defined in lib/mutex.rs, as shown below:

/// @brief Mutex互斥量结构体
/// 请注意!由于Mutex属于休眠锁,因此,如果您的代码可能在中断上下文内执行,请勿采用Mutex!
#[derive(Debug)]
pub struct Mutex<T> {
    /// 该Mutex保护的数据
    data: UnsafeCell<T>,
    /// Mutex锁状态
    lock: AtomicBool,
    /// 等待队列(Waiter/Waker 机制避免唤醒丢失)
    wait_queue: WaitQueue,
}

3. Usage

  Similar to SpinLock, the Rust version of Mutex has a guard. When using it, you need to transfer ownership of the data to be protected to the Mutex. Moreover, the guard can only be created after a successful lock, so there can be at most one guard for each Mutex at any time.

  When you need to read or modify the data protected by the Mutex, first use the lock() method of the Mutex. This method returns a MutexGuard. You can then use the member functions of the protected data to perform operations, or directly read/write the protected data (equivalent to obtaining a mutable reference to the protected data).

  A complete example is shown in the following code:

let x :Mutex<Vec<i32>>= Mutex::new(Vec::new());
    {
        let mut g :MutexGuard<Vec<i32>>= x.lock();
        g.push(1);
        g.push(2);
        g.push(2);
        assert!(g.as_slice() == [1, 2, 2] || g.as_slice() == [2, 2, 1]);
        // 在此处,Mutex是加锁的状态
        debug!("x={:?}", x);
    }
    // 由于上方的变量`g`,也就是Mutex守卫的生命周期结束,自动释放了Mutex。因此,在此处,Mutex是放锁的状态
    debug!("x={:?}", x);

  For variables inside a struct, we can use Mutex for fine-grained locking, i.e., wrapping the member variables that require detailed locking with Mutex, like this:

pub struct a {
  pub data: Mutex<data_struct>,
}

  Of course, we can also lock the entire struct:

struct MyStruct {
  pub data: data_struct,
}
/// 被全局加锁的结构体
pub struct LockedMyStruct(Mutex<MyStruct>);

4. API

4.1. new - Initialize Mutex

Prototype

pub const fn new(value: T) -> Self

Description

  The new() method is used to initialize a Mutex. This method takes the data to be protected as a parameter and returns a Mutex.

4.2. lock - Acquire Lock

Prototype

pub fn lock(&self) -> MutexGuard<T>

Description

  Acquires the Mutex lock and returns the Mutex guard, which you can use to manipulate the protected data.

  If the Mutex is already locked, this method will block and wait via WaitQueue.wait_until() until the lock becomes available. The waiting process uses a Waiter/Waker state machine handshake to prevent wake-up loss.

4.3. try_lock - Attempt to Acquire Lock

Prototype

pub fn try_lock(&self) -> Result<MutexGuard<T>, i32>

Description

  Attempts to acquire the Mutex lock. If the attempt fails, the current process is not added to the waiting queue. If the lock is successfully acquired, the Mutex guard is returned; if the Mutex is already locked, Err(错误码) is returned.