From 8ed8e6e50d96896c8a93e3bfadfc36a83e905c82 Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Tue, 20 Feb 2024 16:43:58 +0100 Subject: [PATCH] Working example for thread- and non-thread-safe applications --- src/bin/arcmutex.rs | 26 ++++++++++++++++++++++++++ src/bin/rcrefcell.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/bin/arcmutex.rs create mode 100644 src/bin/rcrefcell.rs diff --git a/src/bin/arcmutex.rs b/src/bin/arcmutex.rs new file mode 100644 index 0000000..4643176 --- /dev/null +++ b/src/bin/arcmutex.rs @@ -0,0 +1,26 @@ +use std::sync::{Arc, Mutex}; + +fn c(f: F) { + f(); +} + +fn main() { + let v = Arc::new(Mutex::new(vec![1, 2, 3])); + + c({ + let v = v.clone(); + move || { + println!("inner 1: {:?}", v); + v.lock().unwrap().push(4); + } + }); + c({ + let v = v.clone(); + move || { + println!("inner 2: {:?}", v); + v.lock().unwrap().push(5); + } + }); + + println!("outer: {:?}", v); +} diff --git a/src/bin/rcrefcell.rs b/src/bin/rcrefcell.rs new file mode 100644 index 0000000..34271d2 --- /dev/null +++ b/src/bin/rcrefcell.rs @@ -0,0 +1,30 @@ +use std::{cell::RefCell, rc::Rc}; + +fn c(f: F) { + f(); +} + +fn main() { + let v = Rc::new(RefCell::new(vec![1, 2, 3])); + + c({ + let v = v.clone(); + move || { + println!("inner 1: {:?}", v); + v.replace_with(|old| { + old.push(4); + old.to_vec() + }); + } + }); + c({ + let v = v.clone(); + move || { + println!("inner 2: {:?}", v); + // This seems more readable than the example from https://www.youtube.com/watch?v=FTsaDmf0f_0 shown above + v.borrow_mut().push(5); + } + }); + + println!("outer: {:?}", v); +}