Closed WenqingZong closed 1 year ago
章节链接 在讲述死锁时给出了如下代码:
use std::{sync::{Mutex, MutexGuard}, thread}; use std::thread::sleep; use std::time::Duration; use lazy_static::lazy_static; lazy_static! { static ref MUTEX1: Mutex<i64> = Mutex::new(0); static ref MUTEX2: Mutex<i64> = Mutex::new(0); } fn main() { // 存放子线程的句柄 let mut children = vec![]; for i_thread in 0..2 { children.push(thread::spawn(move || { for _ in 0..1 { // 线程1 if i_thread % 2 == 0 { // 锁住MUTEX1 let guard: MutexGuard<i64> = MUTEX1.lock().unwrap(); println!("线程 {} 锁住了MUTEX1,接着准备去锁MUTEX2 !", i_thread); // 当前线程睡眠一小会儿,等待线程2锁住MUTEX2 sleep(Duration::from_millis(10)); // 去锁MUTEX2 let guard = MUTEX2.try_lock(); println!("线程1获取MUTEX2锁的结果: {:?}",guard); // 线程2 } else { // 锁住MUTEX2 let _guard = MUTEX2.lock().unwrap(); println!("线程 {} 锁住了MUTEX2, 准备去锁MUTEX1", i_thread); sleep(Duration::from_millis(10)); let guard = MUTEX1.try_lock(); println!("线程2获取MUTEX1锁的结果: {:?}",guard); } } })); } // 等子线程完成 for child in children { let _ = child.join(); } println!("死锁没有发生"); }
这段代码产生了如下输出:
线程 0 锁住了MUTEX1,接着准备去锁MUTEX2 ! 线程 1 锁住了MUTEX2, 准备去锁MUTEX1 线程2获取MUTEX1锁的结果: Err("WouldBlock") 线程1获取MUTEX2锁的结果: Ok(0) 死锁没有发生
线程名称从0,1变成了1,2,对小白阅读上可能会造成误解。如果把代码中所有hardcode的线程1,线程2更改为线程{i_thread},可以更好的帮助理解。
0
1
2
线程1
线程2
线程{i_thread}
章节链接 在讲述死锁时给出了如下代码:
这段代码产生了如下输出:
线程名称从
0
,1
变成了1
,2
,对小白阅读上可能会造成误解。如果把代码中所有hardcode的线程1
,线程2
更改为线程{i_thread}
,可以更好的帮助理解。