首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitForSingleObject死锁

WaitForSingleObject死锁
EN

Stack Overflow用户
提问于 2015-11-05 17:32:13
回答 1查看 1.6K关注 0票数 0

如果你感兴趣的话,一些背景,否则你可以直接回答下面的问题:

我遇到了一个问题,在这个问题上,我有一个无限的while循环,其中包含两个if条件,以检查两个事件对象状态是否被发出信号。

代码语言:javascript
复制
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;
        }   
    }
}

事件对象USB_PHY_CONNUSB_PHY_DISCONN是在我的OS/BSP驱动程序代码中设置的,它将检测硬件USB连接并继续使用SetEvent()设置相应的事件对象。

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

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-05 17:41:16

您不能在线程之外执行代码!有一个从main开始的“主”线程,但是和其他线程一样,它也是一个线程。

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

这完全可以通过一个锁定命令来解决。如果锁A总是在B之前锁定,则在具有A的线程和具有锁B的其他线程之间不可能发生死锁。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33551088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档