Crate slock

source ·
Expand description

A Slock, or Smart Lock, is a smart wrapper around an atomically reference counted read/write lock.

All accesses and modifications are contained, ensuring that threads will never deadlock on a Slock operation.

use slock::*;

async {
    // Create a new lock with an initial value
    let lock = Slock::new(5i32);

    // Change the lock's value
    lock.set(|v| v + 1).await;

    // Get the lock's value
    let value = lock.get().await;
    println!("{}", value); // 6

    // Use in multiple threads
    tokio::join!(
        do_something_in_a_thread(lock.split()),
        do_something_else_in_a_thread(lock.split()),
        do_another_thing_in_a_thread(lock.split()),
    );
};

Things not to do

Don’t access a Slock from within another

Bad:

let lock_1 = Slock::new(0i32);
let lock_2 = Slock::new(1i32);

// Add the value of lock_2 to lock_1
lock_1.set(|v| v + block_on(lock_2.get())).await;

Good:

let lock_1 = Slock::new(0i32);
let lock_2 = Slock::new(1i32);

// Add the value of lock_2 to lock_1
let v_2 = lock_2.get().await;
lock_1.set(|v| v + v_2).await;

Structs

The Slock object.

Type Definitions

HashMaps