13.死锁的含义

  1. 13.死锁的含义
    1. 14.1 题目
    2. 14.2 深入解析
    3. 14.3 答题示例
    4. 14.4 关键词联想

13.死锁的含义


14.1 题目

请简单描述死锁是什么意思?


14.2 深入解析

死锁是指在多线程编程中,两个或多个线程因争夺共享资源而进入一种互相等待的状态,导致这些线程永远无法继续执行,程序因此停滞不前。
简单讲:就是线程之间因为相互等待对方释放资源,而导致整个程序停滞

using System.Threading;
using UnityEngine;

public class Program
{
    private static readonly object lock1 = new object();
    private static readonly object lock2 = new object();

    static void ThreadA()
    {
        lock (lock1) // 线程 A 获取 lock1
        {
            Debug.Log("Thread A acquired lock1, waiting for lock2...");
            Thread.Sleep(100); // 模拟等待
            lock (lock2) // 线程 A 尝试获取 lock2
            {
                Debug.Log("Thread A acquired lock2");
            }
        }
    }

    static void ThreadB()
    {
        lock (lock2) // 线程 B 获取 lock2
        {
            Debug.Log("Thread B acquired lock2, waiting for lock1...");
            Thread.Sleep(100); // 模拟等待
            lock (lock1) // 线程 B 尝试获取 lock1
            {
                Debug.Log("Thread B acquired lock1");
            }
        }
    }

    static void Main(string[] args)
    {
        Thread t1 = new Thread(ThreadA);
        Thread t2 = new Thread(ThreadB);

        t1.Start();
        t2.Start();
    }
}

14.3 答题示例

“死锁是多线程环境下的一种资源竞争问题,指两个或多个线程因互相等待对方释放资源而陷入无限等待的状态。比如线程A持有锁L1并请求锁L2,而线程B持有锁L2并请求锁L1,此时双方都无法继续执行,程序就会陷入停滞。

死锁的产生需要同时满足四个条件:

  1. 互斥条件:资源不可共享,同一时间只能被一个线程占用;
  2. 占有并等待:线程已持有至少一个资源,还在请求其他线程持有的资源;
  3. 不可抢占:资源只能由持有者主动释放,不能被其他线程强行夺取;
  4. 循环等待:线程间形成环形的资源依赖链。

在游戏开发中,死锁可能出现在多人联机同步、资源管理或异步任务调度中,需通过合理的锁顺序设计、超时机制或使用无锁数据结构来避免。”


14.4 关键词联想

  • 多线程同步
  • 资源竞争
  • 锁(Lock/Mutex)
  • 临界区(Critical Section)
  • 死锁预防(破坏四条件)
  • 死锁检测(如银行家算法)
  • 锁排序(Lock Ordering)
  • 线程安全
  • 并发编程
  • Monitor/ReaderWriterLock


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏