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;
}
}
}
事件对象 USB_PHY_CONN
和 USB_PHY_DISCONN
正在我的 OS/BSP USB 驱动程序代码中设置,它将检测硬件 USB 连接并继续使用 SetEvent()
来设置对应的事件对象。
看了WaitForSingleObject()
的文档,并没有明确说明必须在线程内使用,虽然看了好几遍感觉是暗示了,但我不是100%确定。
我遇到的问题是代码 运行 第一次通过 while 循环(即,usb 最初断开连接,然后连接,然后断开连接),我的系统 运行 没问题并且不挂起。但是,重新连接 USB 后,我的系统死机了。我的设备变得 unresponsive/UI 冻结并且代码丢失。
现在,当我终止包含上述代码的进程时,一切都会重新开始并继续 运行 正常。我做了一些阅读,似乎 WaitForSingleObject()
运行 有可能出现死锁的风险,但我也注意到它总是在线程方面。
我的问题是,WaitForSingleObject()
必须在线程中使用吗?如果我在 main 中无限循环使用它,运行 是否有很高的 deadlock/system 冻结风险?
注意:这是一个带有 VS2008 的平台构建器 windows 嵌入式 CE 7 项目。
您不能在线程外执行代码!有一个从 main
开始的 "main" 线程,但这也是一个与其他线程一样的线程。
也就是说,死锁需要 2 个线程和 2 个同步点。一个线程锁定 A,另一个线程锁定 B,然后两个线程都在尝试获取另一个锁时阻塞。
这完全可以通过锁定命令来解决。如果锁 A 总是 在 B 之前被锁定,那么在拥有 A 的线程和拥有锁 B 的其他线程之间不会发生死锁。
更理论的方法证明问题是锁图中的循环。循环A<=>B是最简单的长度为2的循环。A->B->C->A也可以死锁。一个锁顺序的有向无环图对应一个无死锁的程序。
一些背景如果你感兴趣,否则你可以直接进入底部的问题:
我 运行 遇到一个问题,我有一个无限 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;
}
}
}
事件对象 USB_PHY_CONN
和 USB_PHY_DISCONN
正在我的 OS/BSP USB 驱动程序代码中设置,它将检测硬件 USB 连接并继续使用 SetEvent()
来设置对应的事件对象。
看了WaitForSingleObject()
的文档,并没有明确说明必须在线程内使用,虽然看了好几遍感觉是暗示了,但我不是100%确定。
我遇到的问题是代码 运行 第一次通过 while 循环(即,usb 最初断开连接,然后连接,然后断开连接),我的系统 运行 没问题并且不挂起。但是,重新连接 USB 后,我的系统死机了。我的设备变得 unresponsive/UI 冻结并且代码丢失。
现在,当我终止包含上述代码的进程时,一切都会重新开始并继续 运行 正常。我做了一些阅读,似乎 WaitForSingleObject()
运行 有可能出现死锁的风险,但我也注意到它总是在线程方面。
我的问题是,WaitForSingleObject()
必须在线程中使用吗?如果我在 main 中无限循环使用它,运行 是否有很高的 deadlock/system 冻结风险?
注意:这是一个带有 VS2008 的平台构建器 windows 嵌入式 CE 7 项目。
您不能在线程外执行代码!有一个从 main
开始的 "main" 线程,但这也是一个与其他线程一样的线程。
也就是说,死锁需要 2 个线程和 2 个同步点。一个线程锁定 A,另一个线程锁定 B,然后两个线程都在尝试获取另一个锁时阻塞。
这完全可以通过锁定命令来解决。如果锁 A 总是 在 B 之前被锁定,那么在拥有 A 的线程和拥有锁 B 的其他线程之间不会发生死锁。
更理论的方法证明问题是锁图中的循环。循环A<=>B是最简单的长度为2的循环。A->B->C->A也可以死锁。一个锁顺序的有向无环图对应一个无死锁的程序。