7 releases

Uses old Rust 2015

0.2.5 Dec 7, 2023
0.2.4 Jan 6, 2023
0.2.3 Jul 10, 2020
0.2.2 Jun 15, 2018
0.1.0 Mar 15, 2018

#36 in Concurrency

Download history 1428540/week @ 2024-02-26 1421514/week @ 2024-03-04 1368382/week @ 2024-03-11 1385190/week @ 2024-03-18 1359838/week @ 2024-03-25 1395397/week @ 2024-04-01 1359535/week @ 2024-04-08 1401018/week @ 2024-04-15 1429242/week @ 2024-04-22 1318936/week @ 2024-04-29 1324448/week @ 2024-05-06 1409422/week @ 2024-05-13 1382827/week @ 2024-05-20 1364740/week @ 2024-05-27 1535635/week @ 2024-06-03 1427589/week @ 2024-06-10

5,780,890 downloads per month
Used in 18,031 crates (6 directly)

MIT license

11KB
137 lines

TryLock

A light-weight lock guarded by an atomic boolean.

Most efficient when contention is low, acquiring the lock is a single atomic swap, and releasing it just 1 more atomic swap.

Example

use std::sync::Arc;
use try_lock::TryLock;

// a thing we want to share
struct Widget {
    name: String,
}

// lock it up!
let widget1 = Arc::new(TryLock::new(Widget {
    name: "Spanner".into(),
}));

let widget2 = widget1.clone();


// mutate the widget
let mut locked = widget1.try_lock().expect("example isn't locked yet");
locked.name.push_str(" Bundle");

// hands off, buddy
let not_locked = widget2.try_lock();
assert!(not_locked.is_none(), "widget1 has the lock");

// ok, you can have it
drop(locked);

let locked2 = widget2.try_lock().expect("widget1 lock is released");

assert_eq!(locked2.name, "Spanner Bundle");

lib.rs:

A light-weight lock guarded by an atomic boolean.

Most efficient when contention is low, acquiring the lock is a single atomic swap, and releasing it just 1 more atomic swap.

Example

use std::sync::Arc;
use try_lock::TryLock;

// a thing we want to share
struct Widget {
    name: String,
}

// lock it up!
let widget1 = Arc::new(TryLock::new(Widget {
    name: "Spanner".into(),
}));

let widget2 = widget1.clone();


// mutate the widget
let mut locked = widget1.try_lock().expect("example isn't locked yet");
locked.name.push_str(" Bundle");

// hands off, buddy
let not_locked = widget2.try_lock();
assert!(not_locked.is_none(), "widget1 has the lock");

// ok, you can have it
drop(locked);

let locked2 = widget2.try_lock().expect("widget1 lock is released");

assert_eq!(locked2.name, "Spanner Bundle");

No runtime deps