mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-01-21 20:09:10 +00:00
45 lines
926 B
Markdown
45 lines
926 B
Markdown
# TryLock
|
|
|
|
- [Crates.io](https://crates.io/crates/try-lock)
|
|
- [Docs](https://docs.rs/try-lock)
|
|
|
|
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
|
|
|
|
```rust
|
|
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");
|
|
```
|
|
|