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.