锁(哲学家就餐问题)

锁?

死锁

死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

死锁的四个必要条件

  • 互斥条件:一个资源每次只能被一个执行流使用。
  • 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺。
  • 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系。

死锁的场景

  1. 一个线程加锁一次之后再尝试加锁。
  2. 两个线程1,2,有两把锁,线程1先去获取锁A 再去获取锁B;线程2先取获取锁B,再去获取锁A,也会死锁。
  3. 多个线程多把锁(哲学家就餐问题)。

哲学家就餐问题

哲学家就餐问题: 比如5个哲学家和五根筷子。

哲学家行为:1. 思考(啥都不干) 2. 吃鸡

极端情况,五个哲学家同时拿起自己左手边的筷子,然后哲学家就无法再拿起右手的筷子。
那么当所有哲学家都不愿意放下左手的筷子,就会造成所有线程死锁。

锁(哲学家就餐问题)_第1张图片

解决办法:

  1. 做出约定:先给每个筷子编号,约定哲学家每次先拿编号小的筷子。若所有哲学家依次拿筷子,到最后的哲学家肯定就会拿另一根筷子,就可以避免出现死锁。这样的顺序约定是破除死锁的常见办法。破除死锁中的"环路等待"条件。

    锁(哲学家就餐问题)_第2张图片

    比如现在我给每个筷子给上编号,当一号哲学家拿的时候先拿1号筷子,二号哲学家先拿2号筷子。。以此类推当五号哲学家拿筷子的时候,不会再去拿5号筷子了,而是尝试去拿1号筷子,但是1号筷子已经被一号哲学家拿过了,所以五号哲学家就需要等待。四号哲学家就可以再拿5号筷子可以吃饭了,等他吃完释放4 5 号筷子,3号哲学家就可以吃饭了。。以此类推。这样就解决了。

  2. 搞一个信号量(计数器)初始化为4(比锁的数目小1),每个哲学家拿筷子的时候先进行P操作,当第五个人在申请锁的时候信号量为0,就不可以申请了

你可能感兴趣的:(linux知识点)