[英]WaitForSingleObject Deadlock
如果您有兴趣,请提供一些背景知识,否则可以直接转到底部的问题:
我遇到一个问题,我有一个无限的while
循环,其中有两个if
条件检查两个事件对象的状态是否发出信号。
while(1)
{
if(DAQ_Comm_Server::usb_detect_flag == false)
{
if(WaitForSingleObject(USB_PHY_CONN,INFINITE) == WAIT_OBJECT_0)
{
DAQ_Comm_Server::usb_detect_flag = true;
}
}
if(DAQ_Comm_Server::usb_detect_flag == true)
{
if(WaitForSingleObject(USB_PHY_DISCONN, INFINITE) == NULL)
{
DAQ_Comm_Server::usb_detect_flag = false;
}
}
}
在我的OS / BSP USB驱动程序代码中设置了事件对象USB_PHY_CONN
和USB_PHY_DISCONN
,它将在其中检测硬件USB连接并继续使用SetEvent()
设置相应的事件对象。
阅读WaitForSingleObject()
的文档,它没有明确指出必须在线程内使用,尽管多次阅读后,我觉得它是隐含的,但不是100%肯定。
我遇到的问题是代码第一次通过while循环运行(即,usb最初已断开连接,然后再连接并断开连接),我的系统运行正常并且没有挂起。 但是,重新连接USB后,我的系统死机了。 我的设备无响应/ UI冻结,并且代码丢失。
现在,当我杀死上面代码所在的进程时,一切开始备份并继续正常运行。 我做了一些阅读,似乎WaitForSingleObject()
冒着可能出现死锁的风险,但是我也注意到,它总是在线程方面。
我的问题是 ,是否在线程中使用WaitForSingleObject()
? 如果我在主机的无限循环中使用它,是否会带来死锁/系统冻结的高风险?
注意:这是一个带有VS2008的Windows Builder CE 7项目的平台构建器。
您不能在线程外执行代码! 有一个“主”线程从main
开始,但是也像其他线程一样。
也就是说,死锁需要2个线程和2个同步点。 一个线程锁定A,另一个线程锁定B,然后两个线程在尝试获取另一个锁定时都阻塞。
这完全可以通过锁定命令来解决。 如果锁A 始终在B之前锁定,则在具有A的线程与具有B的其他线程之间不会发生死锁。
一种更理论的方法证明了问题是锁定图中的一个循环。 周期A <=> B是长度2的最简单周期。A-> B-> C-> A也可能死锁。 锁定顺序的有向无环图对应于无死锁程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.