是否有可能通过单锁生成死锁

时间:2013-11-18 21:42:28

标签: multithreading mutex deadlock

这是一个面试问题。 一般情况下,当thread1锁定mutex1时会生成两个线程之间的死锁,并且在它尝试锁定mutex2之前的一刻,线程2锁定了互斥锁2.在该脚步2想要锁定mutex1之后,它们会永远等待彼此。

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

8 个答案:

答案 0 :(得分:5)

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

  1. 线程A抓取互斥锁
  2. 线程B等待互斥锁
  3. 线程A在没有释放互斥锁的情况下死亡
  4. 线程B永远不会运行。

答案 1 :(得分:5)

死锁需要4件事:

相互排斥 - 指的是拥有一个可由单个线程拥有的资源(锁)的想法。
没有先发制人 - 无法强行获得锁定 循环等待 - 指的是一个线程在另一个线程上等待,即等待自身(或链路)
保持并等待 - 线程可以锁定一个并等待另一个

在一次采访中,向他们展示你的思考过程通常更为重要,如果你提出这些规则,他们可能会为你做更多的事情而不是试图给出“技术上正确”的技巧答案。

你可以这样做,但是:
主线程锁定资源,然后将一些任务发送到线程池。这些任务等待资源。主线程等待任务。

答案 2 :(得分:0)

我认为只有一个锁就可以造成死锁。但是,如果锁定的持续时间超过等待它的其他进程/线程的超时阈值,则可以超时。

答案 3 :(得分:0)

如果您有两个进程,即使没有任何锁定,您也可能遇到死锁情况:https://stackoverflow.com/a/17320443/145757

答案 4 :(得分:0)

是的,您锁定互斥锁或关键部分但忘记解锁(例如在某个退出代码路径中)。尝试访问此代码的下一个线程是死锁。我刚刚面对这种情况。

答案 5 :(得分:0)

当您考虑死锁(以及大多数线程主题)时,您不会考虑线程同步机制,而是考虑资源获取。只需在循环中等待正确的资源状态,就可以在没有任何互斥锁,事件或semafor的情况下执行死锁,如果这种情况发生在可以修改资源的所有线程中,则会出现死锁。从这个角度来看,我认为正确答案应该是问题很严重。

答案 6 :(得分:0)

这样的东西?使用 1 mutex 和1个帖子获取死锁:

#define LOCK(std_mutex)    std::lock_guard<std::mutex> LOCK_GUARD(std_mutex)
std::mutex lock;

int main ()
{
    LOCK(lock);

    {
        LOCK(lock); //deadlock...
    }

    std::cout<<"end"; //never goes here

    return 0;
}

答案 7 :(得分:0)

假设您的程序使用中断处理程序。正常程序锁定资源。并且在释放锁之前发生中断。并且中断处理程序也想锁定该资源。这可能导致中断处理程序永远不会返回,程序也不会恢复。

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