use std::thread;
#[derive(Debug)]
struct Parent {
id: i32,
child: Option<Arc<Mutex<Child>>>,
}
impl Parent {
pub fn get_value(&self) {
println!("{}", self.id);
}
pub fn set_child(&mut self, child: Arc<Mutex<Child>>) {
self.child = Some(child);
}
pub fn run(&self) {
println!("run");
if let Some(child_ref) = self.child.as_ref() {
let child = child_ref.lock().unwrap(); // 使用lock来获取Mutex的互斥锁
child.call_parent(self);
}
}
}
#[derive(Debug)]
struct Child {
parent: Option<Arc<Mutex<Parent>>>,
}
impl Child {
pub fn call_parent(&self, parent: &Parent) {
parent.get_value();
}
}
fn main() {
println!("Hello, world!");
let parent = Arc::new(Mutex::new(Parent { id: 123, child: None }));
//如果注释掉这里会死锁,为什么?
// {
let child = Child { parent: Some(Arc::clone(&parent)) };
let mut p = parent.lock().unwrap(); // 获取Parent的Mutex锁
p.set_child(Arc::new(Mutex::new(child))); // 设置child
p.run(); // 运行Parent的run方法
//或者用这种方式来释放锁?测试也是可以的
// drop(p); // 释放Parent的Mutex锁
// }
let parent_clone1=Arc::clone(&parent);
let parent_clone2=Arc::clone(&parent);
let thread1 = thread::spawn(move || {
println!("{:?}", "thread1");
let p1 = parent_clone1.lock().unwrap(); // 获取Parent的Mutex锁
println!("{:?}", p1);
});
let thread2 = thread::spawn(move || {
println!("{:?}", "thread2");
let p2 = parent_clone2.lock().unwrap(); // 获取Parent的Mutex锁
println!("{:?}", p2);
});
thread1.join().expect("thread1 Couldn't join on the associated thread");
thread2.join().expect("thread2 Couldn't join on the associated thread");
// println!("{:?}", child);
}```
问题在代码中,麻烦细看
1
共 7 条评论, 1 页
评论区
写评论实在太丑,丑到我以为回到了2000年
--
👇
asuper: 几个月以前,我也提过建议,站长说是在开发新版,这个版本大概率是不会改动了
--
👇
AnkoGo123: 感觉这个论坛的帖子层级不大好友,希望可以改进下
几个月以前,我也提过建议,站长说是在开发新版,这个版本大概率是不会改动了
--
👇
AnkoGo123: 感觉这个论坛的帖子层级不大好友,希望可以改进下
感觉这个论坛的帖子层级不大好友,希望可以改进下
好的,非常感谢,初学,有点难,多谢大佬帮助解惑
--
👇
dakai-chen: 使用 {} 限制作用域,或者使用
drop
提前释放都是可以的。使用 {} 限制作用域,或者使用
drop
提前释放都是可以的。明白了,所以正常写代码中,我们该如何释放锁呢?一般
--
👇
dakai-chen:
p
是锁的守卫,释放p
将归还锁。此代码中p
将一直生存到主线程结束,所以子线程无法获得锁。p
是锁的守卫,释放p
将归还锁。此代码中p
将一直生存到主线程结束,所以子线程无法获得锁。