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 |
#35 in Concurrency
8,251,711 downloads per month
Used in 19,887 crates
(7 directly)
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");