这是一个面试问题。 一般情况下,当thread1锁定mutex1时会生成两个线程之间的死锁,并且在它尝试锁定mutex2之前的一刻,线程2锁定了互斥锁2.在该脚步2想要锁定mutex1之后,它们会永远等待彼此。
问题是“你能用一个互斥锁和任意数量的线程给出一个死锁情景吗?”
答案 0 :(得分:5)
这取决于你如何定义"死锁"我猜,但我可以看到一种可能性:
线程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)
假设您的程序使用中断处理程序。正常程序锁定资源。并且在释放锁之前发生中断。并且中断处理程序也想锁定该资源。这可能导致中断处理程序永远不会返回,程序也不会恢复。
基本上仍然有两方试图使用相同的资源。但即使在单线程环境中也无法防止中断发生。