#rw-lock #mutex #mutex-lock

padlock

Safely acquire RwLock/Mutex locks

3 unstable releases

0.2.0 May 4, 2020
0.1.1-alpha Feb 1, 2020
0.1.0-alpha Jan 28, 2020

#1850 in Concurrency

Download history 815/week @ 2025-10-21 824/week @ 2025-10-28 1166/week @ 2025-11-04 810/week @ 2025-11-11 773/week @ 2025-11-18 862/week @ 2025-11-25 764/week @ 2025-12-02 756/week @ 2025-12-09 697/week @ 2025-12-16 717/week @ 2025-12-23 716/week @ 2025-12-30 532/week @ 2026-01-06 776/week @ 2026-01-13 961/week @ 2026-01-20 1116/week @ 2026-01-27 1046/week @ 2026-02-03

3,939 downloads per month
Used in 10 crates (via tray-item)

MIT/Apache

9KB
96 lines

Padlock

Safely acquire RwLock/Mutex locks and never worry about remembering to drop them!

CircleCI docs

License

MIT or Apache-2.0


lib.rs:

Aquire Mutex and RwLocks safely.

All methods in this crate will try to lock the passed Mutex or RwLock, if the locking fails, spin_loop_hint is called and we try again. This practice is called spinlock.

This means that all calls will block the current thread.

Important: When using methods like mutex_lock, remember that the lock is droped first when the lambda finishes running.

Example:

use std::{
    thread,
    sync::{Arc, Mutex},
    time::Duration
};

#[derive(Debug)]
struct Person {
    age: u8,
    name: String
}

fn main() {

    let people = Arc::new(Mutex::new(Vec::<Person>::new()));
    let mut threads = Vec::<thread::JoinHandle<()>>::new();

    // Write in one thread
    let people_clone = Arc::clone(&people);
    threads.push(thread::spawn(move || {

        for i in 0..10 {

            padlock::mutex_lock(&people_clone, |lock| {

                lock.push(Person {
                    age: i * 10,
                    name: format!("Name {}", i)
                });

            });

            thread::sleep(Duration::from_millis(500));

        }

    }));

    // Read from another
    let people_clone = Arc::clone(&people);
    threads.push(thread::spawn(move || {

        for _ in 0..6 {

            padlock::mutex_lock(&people_clone, |lock| {

                for person in lock {
                    println!("{:?}", person);
                }

            });

            thread::sleep(Duration::from_secs(1));

        }

    }));

    for t in threads {
        t.join();
    }

}

No runtime deps