0

如果您有兴趣,请提供一些背景知识,否则您可以直接进入底部的问题:

我遇到了一个问题,我有一个无限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 连接并继续用于USB_PHY_CONN设置相应的事件对象。USB_PHY_DISCONNSetEvent()

阅读 的文档WaitForSingleObject(),并没有明确声明它必须在线程内使用,尽管多次阅读后我觉得它是隐含的,但我不是 100% 确定。

我遇到的问题是代码第一次通过 while 循环运行(即,usb 最初断开连接,然后连接,然后断开连接),我的系统运行良好并且没有挂起。但是,重新连接 USB 后,我的系统冻结了。我的设备变得无响应/UI 冻结并且代码丢失。

现在,当我终止包含上述代码的进程时,一切都会重新启动并继续正常运行。我做了一些阅读,似乎WaitForSingleObject()有可能出现死锁的风险,但我也注意到它总是在线程方面。

我的问题是WaitForSingleObject()必须在线程中使用吗?如果我在主程序的无限循环中使用它,这是否会导致死锁/系统冻结的高风险?

注意:这是一个带有 VS2008 的平台构建器 windows 嵌入式 CE 7 项目。

4

1 回答 1

1

你不能在线程外执行代码!有一个“主”线程开始,main但这也是一个与其他线程一样的线程。

也就是说,死锁需要 2 个线程和 2 个同步点。一个线程锁定 A,另一个线程锁定 B,然后两个线程在尝试获取另一个锁定时都阻塞。

这完全可以通过锁定命令来解决。如果锁 A总是在 B 之前被锁住,那么拥有 A 的线程和拥有锁 B 的其他线程之间就不会发生死锁。

更理论的方法证明问题是锁图中的一个循环。循环 A<=>B 是长度为 2 的最简单循环。 A->B->C->A 也可以死锁。锁定顺序的有向无环图对应于无死锁程序。

于 2015-11-05T17:41:16.257 回答