12 stable releases
2.2.1 | Sep 7, 2024 |
---|---|
2.2.0 | Oct 18, 2023 |
2.1.1 | Sep 25, 2023 |
2.1.0 | Apr 7, 2023 |
1.0.1 | May 28, 2020 |
#51 in Concurrency
4,100,930 downloads per month
Used in 5,625 crates
(9 directly)
19KB
191 lines
parking
Thread parking and unparking.
A Parker
is in either the notified or unnotified state. The park()
method blocks
the current thread until the Parker
becomes notified and then puts it back into the unnotified
state. The unpark()
method puts it into the notified state.
This API is similar to thread::park()
and Thread::unpark()
from the standard library.
The difference is that the state "token" managed by those functions is shared across an entire
thread, and anyone can call thread::current()
to access it. If you use park
and unpark
,
but you also call a function that uses park
and unpark
internally, that function could
cause a deadlock by consuming a wakeup that was intended for you. The Parker
object in this
crate avoids that problem by managing its own state, which isn't shared with unrelated callers.
Examples
use std::thread;
use std::time::Duration;
use parking::Parker;
let p = Parker::new();
let u = p.unparker();
// Notify the parker.
u.unpark();
// Wakes up immediately because the parker is notified.
p.park();
thread::spawn(move || {
thread::sleep(Duration::from_millis(500));
u.unpark();
});
// Wakes up when `u.unpark()` notifies and then goes back into unnotified state.
p.park();
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~0–24MB
~333K SLoC