use std::thread;
use std::sync::{Mutex,Arc};
#[derive(Debug)]
struct Philosopher {
name:String,
left:usize,
right:usize,
}
impl Philosopher {
fn new(name: &str,left:usize,right:usize) -> Philosopher {
Philosopher{name:name.to_string(),
left:left,
right:right,
}
}
fn eat(&self,table:&Table){
let _left = table.forks[self.left].lock().unwrap();//获得左锁和右锁,不懂
let _right = table.forks[self.right].lock().unwrap();
println!("{} is eating",self.name);
thread::sleep_ms(1000);
println!("{} is done eating",self.name);
}
}
#[derive(Debug)]
struct Table {
forks: Vec<Mutex<()>>,
}
fn main() {
let table = Arc::new(Table{
forks:vec![
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
]
});
let philosophers = vec![
Philosopher::new("Baruch Spinoza", 0, 1),
Philosopher::new("Gilles Deleuze", 1, 2),
Philosopher::new("Karl Marx", 2, 3),
Philosopher::new("Friedrich Nietzsche", 3, 4),
Philosopher::new("Michel Foucault", 0, 4),
];
let handles:Vec<_> = philosophers.into_iter().map(|p|{//philosophers 创建迭代器,拥有每个哲学家的所有权,map()接受一个闭包作为参数
let table = table.clone();//克隆table,引用技术加1
thread::spawn(move ||{//线程开始,传入哲学家所有权
p.eat(&table);
})
}).collect();//收集map结果,打包,赋值给handles
for h in handles{//遍历handles,
h.join().unwrap();//阻塞线程,确保主线程在所有线程结束之后退出
}
}
rust哲学家问题
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、信号量 信号量是一个与队列有关的整型变量。 可以初始化成非负数; semWait操作使信号量减1。若值为负数,...