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

Yak*_*kov 3 multithreading mutex deadlock

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

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

Chr*_*res 5

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

  1. 线程A抓取互斥锁
  2. 线程B等待互斥锁
  3. 线程A在没有释放互斥锁的情况下死亡

线程B永远不会运行.


bde*_*n20 5

死锁需要4件事:

互斥 - 指拥有可由单个线程拥有的资源(锁)的想法.
没有先发制人 - 无法强制获取锁定
循环等待 - 指的是一个线程正在等待另一个,即等待自己(或链)
保持和等待 - 一个线程能够锁定一个并等待另一个

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

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

  • “等待任务”,“等待资源”。我认为这更好地暴露了 Yakov 理解中的一个缺陷:导致死锁的不是锁,而是等待某些东西(无论是锁还是其他任何东西)。 (2认同)