文档章节

Rust 2 Dining Philosopher Problem

shengjuntu
 shengjuntu
发布于 2015/08/26 23:09
字数 151
阅读 22
收藏 0

use std::thread;
use std::sync::{Mutex, Arc};

struct Table {
    forks:Vec<Mutex<()>>,
}

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);
    }
}

fn main() {
    let table = Arc::new(Table {forks:vec![
        Mutex::new(()),
        Mutex::new(()),
        Mutex::new(()),
        Mutex::new(()),
        Mutex::new(()),
        ]} );
        
    let philosophers = vec![
        Philosopher::new("Judith Butler", 0, 1),
        Philosopher::new("Gilles Deleuze", 1, 2),
        Philosopher::new("Karl Marx",2, 3),
        Philosopher::new("Emma Goldman",3, 4),
        Philosopher::new("Michel Foucault", 4, 0),
    ];


    let handlers: Vec<_> = philosophers.into_iter().map(|p| {
        let table = table.clone();
        thread::spawn(move || {
            p.eat(&table);
        })

    }).collect();

    for h in handlers {
        h.join().unwrap();
    }



}

© 著作权归作者所有

上一篇: Netty 使用总结
下一篇: Rust lang Helloworld
shengjuntu
粉丝 14
博文 87
码字总数 17069
作品 0
上海
程序员
私信 提问
加载中

评论(1)

shengjuntu
shengjuntu 博主
Rust官网上的例子,这个学习曲线太陡峭。建议先看看Java 8 中的Stream编程。
并且知道一点Lisp的form。
Why Go Is Not Good

I like Go. I use it for a number of things (including this blog). Go is useful. With that said, Go is not a good language. It's not bad; it's just not good. We have to be carefu......

Jerikc
2014/06/30
627
0
Bryce1010专题训练——最大流

版权声明:时间是有限的,知识是无限的,那就需要在有限的时间里最大化的获取知识。 https://blog.csdn.net/Firetocheat_/article/details/83419978 Bryce1010专题训练——最大流 Edmonds-Ka...

bryce1010
2018/10/26
0
0
java中的死锁问题研究

1.什么是死锁: 百度百科的定义: 所谓死锁:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统...

双月通天
2016/06/06
67
0
从C++和OCaml程序员的视角看Rust (Part 2)

本文来源地址 SEPTEMBER 29, 2017 by GUILLAUME ENDIGNOUX @GEndignoux This post is the second of my series about Rust compared to other languages. After a first post about the basi......

朱小虎XiaohuZhu
06/04
0
0
Design of zmq.rs - the native ZeroMQ stack in Rust (1)

zmq.rs 项目的设计介绍,因为要贴给 rust-dev / zeromq-dev 邮件列表,所以用英文写了,稍后再贴一份中文版的。 It is the first time I write a blog post in English, formally. I would l...

fantix
09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
4
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
3
0
JAVA 利用时间戳来判断TOKEN是否过期

import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;/** * @descri......

huangkejie
昨天
3
0
分页查询

一、配置 /*** @author beth* @data 2019-10-14 20:01*/@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ ......

一个yuanbeth
昨天
6
0
在LINQPad中使用Ignite.NET

LINQPad是进行.NET开发的一款优秀工具,非常有利于Ignite.NET API的快速入门。 入门 下载LINQPad:linqpad.net/Download.aspx,注意要选择64位操作系统的AnyCPU版本; 安装Ignite.NET的NuGet...

李玉珏
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部