6 releases

Uses old Rust 2015

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

#29 in Concurrency

Download history 737238/week @ 2023-02-13 752553/week @ 2023-02-20 789862/week @ 2023-02-27 817290/week @ 2023-03-06 805988/week @ 2023-03-13 926751/week @ 2023-03-20 822647/week @ 2023-03-27 716399/week @ 2023-04-03 765248/week @ 2023-04-10 787763/week @ 2023-04-17 772537/week @ 2023-04-24 736779/week @ 2023-05-01 763407/week @ 2023-05-08 775779/week @ 2023-05-15 785416/week @ 2023-05-22 722356/week @ 2023-05-29

3,087,928 downloads per month
Used in 13,028 crates (4 directly)

MIT license

11KB
141 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