Crate event_listener[−][src]
Notify async tasks or threads.
This is a synchronization primitive similar to eventcounts invented by Dmitry Vyukov.
You can use this crate to turn non-blocking data structures into async or blocking data structures. See a simple mutex implementation that exposes an async and a blocking interface for acquiring locks.
Examples
Wait until another thread sets a boolean flag:
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::thread; use std::time::Duration; use std::usize; use event_listener::Event; let flag = Arc::new(AtomicBool::new(false)); let event = Arc::new(Event::new()); // Spawn a thread that will set the flag after 1 second. thread::spawn({ let flag = flag.clone(); let event = event.clone(); move || { // Wait for a second. thread::sleep(Duration::from_secs(1)); // Set the flag. flag.store(true, Ordering::SeqCst); // Notify all listeners that the flag has been set. event.notify(usize::MAX); } }); // Wait until the flag is set. loop { // Check the flag. if flag.load(Ordering::SeqCst) { break; } // Start listening for events. let listener = event.listen(); // Check the flag again after creating the listener. if flag.load(Ordering::SeqCst) { break; } // Wait for a notification and continue the loop. listener.wait(); }
Structs
Event | A synchronization primitive for notifying async tasks and threads. |
EventListener | A guard waiting for a notification from an |