线程死锁:哲学家问题

死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去

死锁发生的条件

死锁发生同时满足的四个条件:

  1. 互斥条件:一个资源每次只能被一个进程使用

  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放

  3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺

  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

避免死锁发生

避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的线程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁

哲学家问题

题目简述

5个哲学家围城一圈就餐,因为哲学家都比较穷,每个人只能买得起一根筷子,所以5个哲学家就餐 。因为哲学家通常都是在思考,所以5个哲学家并不是同时进餐.但是当他们进餐时,必须获取放置在他们左边和右边的筷子,如果他们左边或者右边的筷子已经被别人拿去了,那他就有等待别人放下筷子时才能获取筷子

实现

哲学家问题源码

破坏死锁

只要破坏死锁的4个条件当中的一个即可解决死锁问题

  • 对于哲学家问题来说,条件4最容易破解,让最后一个哲学家先拿其左边的筷子,然后拿右边筷子
for(inti=0; i<size; i++){
    if(i<(size-1)){
        exec.execute(new Philosopher(sticks[i], sticks[i+1], i, ponder));
    } else {
        //最后一个哲学家先拿左手边的筷子
        exec.execute(new Philosopher(sticks[0], sticks[i], i, ponder));
    }
}

results matching ""

    No results matching ""