Skip to content

Instantly share code, notes, and snippets.

@schiemon
Created February 23, 2021 12:56
Show Gist options
  • Save schiemon/6566979a005b748aee0eff8c356fe9a6 to your computer and use it in GitHub Desktop.
Save schiemon/6566979a005b748aee0eff8c356fe9a6 to your computer and use it in GitHub Desktop.
Provoking a deadlock in Rust
fn make_deadlock() {
let a = Arc::new(Mutex::new(1u32));
let aa = Arc::clone(&a);
let b = Arc::new(Mutex::new(1u32));
let bb = Arc::clone(&b);
let t_a = spawn(move || loop {
do_locking("A".to_string(), "a".to_string(), &*a, "b".to_string(), &*b);
});
let t_b = spawn(move || loop {
do_locking(
"B".to_string(),
"b".to_string(),
&*bb,
"a".to_string(),
&*aa,
);
});
t_a.join().unwrap();
t_b.join().unwrap();
}
fn do_locking(name: String, a_name: String, a: &Mutex<u32>, b_name: String, b: &Mutex<u32>) {
println!("{} wants to lock {}.", name, a_name);
let a_lock = a.lock().unwrap();
println!(
"{} has lock for {} and now wants to lock {}.",
name, a_name, b_name
);
let b_lock = b.lock().unwrap();
println!("{} got that lock too.", name);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment