Skip to main content

Mutex

Type Alias Mutex 

Source
pub type Mutex<T> = Mutex<RawMutex, T>;
Expand description

A mutual exclusion primitive useful for protecting shared data.

This mutex will block threads waiting for the lock to become available. The mutex can be statically initialized or created by the new constructor. Each mutex has a type parameter which represents the data that it is protecting. The data can only be accessed through the RAII guards returned from lock and try_lock, which guarantees that the data is only ever accessed when the mutex is locked.

§Fairness

This mutex uses unfair unlocking by default, which allows the unlocking thread to re-acquire the mutex before a waiting thread and generally improves throughput. This can starve waiting threads.

Fair unlocking can be requested explicitly by calling MutexGuard::unlock_fair instead of simply dropping the MutexGuard. A fair unlock hands the mutex directly to a waiting thread.

§Differences from the standard library Mutex

  • No poisoning, the lock is released normally on panic.
  • Only requires 1 byte of lock state.
  • Supports locking with a timeout.
  • Allows raw locking & unlocking without a guard.
  • Supports explicit fair unlocking through MutexGuard::unlock_fair.

§Examples

use parking_lot::Mutex;
use std::sync::{Arc, mpsc::channel};
use std::thread;

const N: usize = 10;

// Spawn a few threads to increment a shared variable (non-atomically), and
// let the main thread know once all increments are done.
//
// Here we're using an Arc to share memory among threads, and the data inside
// the Arc is protected with a mutex.
let data = Arc::new(Mutex::new(0));

let (tx, rx) = channel();
for _ in 0..N {
    let (data, tx) = (Arc::clone(&data), tx.clone());
    thread::spawn(move || {
        // The shared state can only be accessed once the lock is held.
        // Our non-atomic increment is safe because we're the only thread
        // which can access the shared state when the lock is held.
        let mut data = data.lock();
        *data += 1;
        if *data == N {
            tx.send(()).unwrap();
        }
        // the lock is unlocked here when `data` goes out of scope.
    });
}

rx.recv().unwrap();

Aliased Type§

pub struct Mutex<T> { /* private fields */ }