WaitForSingleObject Deadlock
WaitForSingleObject Deadlock
如果你感兴趣,可以选择一些背景,否则你可以直接进入底部的问题:
我遇到了一个问题,其中我有一个带有两个if
条件的无限while
循环,检查两个事件对象状态是否变为信号状态。
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时,我的系统会冻结。我的设备没有响应/UI冻结,代码丢失。
现在,当我终止包含上述代码的进程时,一切都会重新启动并继续正常运行。我读了一些文章,WaitForSingleObject()
似乎有可能出现死锁的风险,但我也注意到它总是以线程为单位。
我的问题是,WaitForSingleObject()
必须在线程中使用吗?如果我在main中的无限循环中使用它,这是否会导致死锁/系统冻结的高风险?
注:这是一个带有VS2008的平台构建器windows嵌入式CE 7项目。
您不能在线程外执行代码!有一个从main
开始的"主"线程,但这也是一个与其他线程一样的线程。
也就是说,死锁需要2个线程和2个同步点。一个线程锁定A,另一个线程锁B,然后两个线程在试图获取另一个锁时都会阻塞。
这完全可以通过锁定顺序来解决。如果锁A总是在B之前锁定,那么在具有A的线程和具有锁B的其他线程之间不会发生死锁。
一种更为理论化的方法证明了这个问题是锁图中的一个循环。周期A<=>B是长度为2的最简单循环。A->B->C->A也可以死锁。锁序的有向非循环图对应于无死锁程序。
- 是"deadlock"吗?如何在多线程中避免它?
- OpenCV OpenCL Thread Saftey - Deadlock (将 cv::Mat 更改为 UMat)
- 是否有一个术语来表示"single mutex deadlock"(具有非递归互斥锁的死锁类型情况)?
- IDirect3DDevice9 Release deadlock
- RPi2, OpenMAX, Deadlock
- Linux 3.0: futex-lock deadlock bug?
- WaitForSingleObject Deadlock
- std::thread.join() deadlock
- "Deadlock"与MPI_Waitall
- __syncthreads() Deadlock