我有一个使用 TCP (Winsock API) 和 HTTP (WININET API) 套接字的应用程序。这是一个多线程应用程序,我有一种情况,当出现网络故障时,我会调用一个重新连接线程(有一个 while 循环,虽然休眠了几秒钟,每个都用于 tcp reconnect 和 http reconnect - 基本上是尝试套接字连接)。当 tcp reconnect thread 和 http reconnect thread 在一段时间后运行时,tcp reconnect thread 到达此行:
TCP重新连接线程:
DWORD WINAPI MyThreadProc ( LPVOID lParam )
{
printf ( "In MyThreadProc" ) ;
// Code
return 1 ;
}
hSampleHandle = CreateThread ( 0 , 0 (LPTHREAD_START_ROUTINE)MyThreadProc, this , 0 , &threadId ) ;
HTTP重新连接线程:
DWORD WINAPI MyHttpThreadProc ( LPVOID lParam )
{
printf ( "In HTTP Reconnect" ) ;
// Code
return 1 ;
}
hHttpReq = CreateThread ( 0 , 0 , MyHttpThreadProc , this , 0 , &ThreadId ) ;
我检查 hSampleHandle 返回值,它不是 NULL 我也得到一个 threadId 。但是 MyThreadProc 没有被调用。然后我执行 WaitForSingleObject which timeout 。我真的很想知道这种行为的原因是什么?
更新:1)注释掉 MyHttpThreadProc 中的代码后,我无法重现该错误。所以很明显,winsock 和 wininet 实现之间共享了一些资源,导致了这种奇怪的行为。
2)我尝试冻结 HTTP 重新连接线程(来自 Visual Studio 2012 中的 ThreadWindow)并且 TCP 重新连接线程工作正常。这导致了以下探测:
PS:1)这两者在应用程序级别之间没有共享资源。
2)我怀疑死锁并继续在 windbg(用户模式死锁)中进行调试,它显示了 9 个关键部分,但所有 9 个部分的 lockcount 值都未锁定。
3)我的另一个怀疑是WINSOCK和WININET一起使用。我知道他们都使用 mswsock.dll 并且它可能是导致内核死锁的加载程序锁吗?在发布 !kdexts.locks 时,我遇到了一些错误,所以我没有深入研究。
4)这是否属于线程冻结类别?有人可以解释这种行为。
5)这个http://www.cpptalk.net/threadproc-does-not-run-when-createthread-is-called-within-vt7735.html在这里没有用,因为我不使用单独的 dll 。