0 Tage Serie
rust / expert
Snippet

Eigene Waker-gesteuerte Future-Implementierung

Manuelle Future-Implementierungen erfordern eine threadsichere Waker-Registrierung und atomare Synchronisation, um asynchrone Executoren zu benachrichtigen, wenn Daten verfügbar sind, ohne in einer Schleife zu pollen.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use std::future::Future;
use std::pin::Pin;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::task::{Context, Poll, Waker};
pub struct SignalFuture {
state: Arc<SignalState>,
}
struct SignalState {
completed: AtomicBool,
waker: std::sync::Mutex<Option<Waker>>,
}
impl Future for SignalFuture {
type Output = &'static str;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
if self.state.completed.load(Ordering::Acquire) {
Poll::Ready("Signal received")
} else {
let mut waker_guard = self.state.waker.lock().unwrap();
*waker_guard = Some(cx.waker().clone());
Poll::Pending
}
}
}
Erklärung
1
pub struct SignalFuture {
Definiert eine Wrapper-Struktur, die eine geteilte atomare Zustandsreferenz über asynchrone Kontexte hinweg hält.
2
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
Implementiert den zentralen Polling-Einstiegspunkt des std Future-Traits.
3
if self.state.completed.load(Ordering::Acquire) {
Prüft den atomaren Fertigstellungszustand mit Acquire-Speicherreihenfolge.
4
*waker_guard = Some(cx.waker().clone());
Registriert den Reactor-Waker in einem Mutex für verzögerte Ausführungsbenachrichtigungen.