Multithreading 是否可以使用单锁生成死锁

Multithreading 是否可以使用单锁生成死锁,multithreading,mutex,deadlock,Multithreading,Mutex,Deadlock,这是一个面试问题。 通常,当thread1锁定mutex1时,两个线程之间会产生死锁,在它尝试锁定mutex2之前,线程2会锁定mutex2。在这之后,线程2想要锁定mutex1。因此它们会永远等待对方 问题是“你能给出一个有一个互斥锁和任意数量线程的死锁场景吗?”我想这取决于你如何定义“死锁”,但我可以看到一种可能性: 线程A获取互斥锁 线程B等待互斥 线程A在不释放互斥锁的情况下死亡 线程B永远不会运行。我认为只有一个锁被持有时不会出现死锁。但是,如果锁的持有时间超过等待它的其他进程/线程的

这是一个面试问题。 通常,当thread1锁定mutex1时,两个线程之间会产生死锁,在它尝试锁定mutex2之前,线程2会锁定mutex2。在这之后,线程2想要锁定mutex1。因此它们会永远等待对方


问题是“你能给出一个有一个互斥锁和任意数量线程的死锁场景吗?”

我想这取决于你如何定义“死锁”,但我可以看到一种可能性:

  • 线程A获取互斥锁
  • 线程B等待互斥
  • 线程A在不释放互斥锁的情况下死亡

  • 线程B永远不会运行。

    我认为只有一个锁被持有时不会出现死锁。但是,如果锁的持有时间超过等待它的其他进程/线程的超时阈值,则可以有一个超时。

    死锁需要4件事:

    互斥-指拥有可由单个线程拥有的资源(锁)的想法。
    无优先权-无法强制获取锁
    循环等待-指一个线程在另一个线程上等待,即在自身(或链)上等待
    保持并等待-线程能够获取一个锁并等待另一个锁

    在面试中,通常更重要的是向他们展示你的思维过程,如果你提出这些规则,他们可能会比试图给出一个“技术正确”的诡计答案对你更有帮助

    您可以这样做,不过:

    主线程锁定资源,然后向线程池发送一些任务。这些任务等待资源。主线程等待任务。

    如果您有两个进程,即使没有任何锁,也可能出现死锁情况:

    是的,您锁定了互斥锁或关键部分,但忘记了解锁(比如在某个退出代码路径中)。下一个试图访问此代码的线程是死锁。我只是面对这个场景。

    当你考虑死锁(和大多数线程主题)时,你不考虑线程同步机制,而是考虑资源获取。只要在循环中等待正确的资源状态,就可以在没有任何互斥、事件或semafor的情况下执行死锁,如果所有可以修改资源的线程都出现这种情况,那么您就已经遇到了死锁。从这个角度来看,我认为正确的答案应该是,这个问题问得很糟糕。

    像这样的问题?使用1个互斥锁和1个线程获取死锁:

    #定义锁(标准互斥)标准::锁(标准互斥)
    std::互斥锁;
    int main()
    {
    锁(锁);
    {
    锁(LOCK);//死锁。。。
    }
    
    std::cout假设您的程序使用中断处理程序。正常程序锁定一个资源。在释放锁之前会发生中断。中断处理程序也想锁定该资源。这可能导致中断处理程序永远不会返回,并且您的程序也不会恢复


    基本上,仍然有两方试图使用相同的资源。但即使在单线程环境中,也无法阻止中断发生。

    这只是一个糟糕的程序。但这是一个很好的面试答案!对,线程a甚至不需要死机来造成死锁:如果互斥体获取和释放之间的代码要抛出一个异常(在一种支持异常的语言中),并且发行版没有处于某种类型的
    最终
    块中,任何线程都无法再次获得该锁。这对我来说似乎是一个完全有效的可能性,正如James指出的,是一个很好的面试问题。“等待任务”,“等待资源”.我认为这更好地暴露了Yakov理解中的一个缺陷:导致死锁的不是锁,而是等待某个东西(无论是锁还是其他东西)。