You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
use std::sync::Arc;use arc_swap::ArcSwap;/// État global de l'application#[derive(Clone,Default)]pubstructAppState{pubuser:Option<User>,pubdocuments:Vec<Document>,pubsettings:Settings,pubui:UiState,}/// Store avec accès thread-safepubstructStore{state:Arc<ArcSwap<AppState>>,}implStore{pubfnnew() -> Self{Self{state:Arc::new(ArcSwap::new(Arc::new(AppState::default()))),}}/// Lecture (très rapide, sans lock)pubfnget(&self) -> Arc<AppState>{self.state.load_full()}/// Mise à jour avec une fonctionpubfnupdate(&self,f:implFnOnce(&mutAppState)){let current = self.state.load();letmut new_state = (**current).clone();f(&mut new_state);self.state.store(Arc::new(new_state));}/// Mise à jour atomique (RCU - Read-Copy-Update)pubfnupdate_rcu<F>(&self,f:F)whereF:FnOnce(&AppState) -> AppState,{self.state.rcu(|state| Arc::new(f(state)));}}
Accès thread-safe
// Plusieurs threads peuvent lire simultanémentlet store = Arc::new(Store::new());// Thread 1let store1 = Arc::clone(&store);
std::thread::spawn(move || {let state = store1.get();println!("User: {:?}", state.user);});// Thread 2let store2 = Arc::clone(&store);
std::thread::spawn(move || {let state = store2.get();println!("Documents: {}", state.documents.len());});// Thread UI peut mettre à jour
store.update(|state| {
state.user = Some(new_user);});