繁体   English   中英

WaitForSingleObject死锁

[英]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_CONNUSB_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM