c++ ThreadProc没有被调用,尽管CreateThread成功

c++ ThreadProc not Invoked inspite of CreateThread Succeeding

本文关键字:尽管 CreateThread 成功 调用 ThreadProc c++      更新时间:2023-10-16

我有一个同时使用TCP (Winsock API)和HTTP (WININET API)套接字的应用程序。这是一个多线程的应用程序,我有一个情况,当有一个网络故障,我调用一个重新连接线程(有一个while循环,睡了几秒钟,虽然,每个tcp重新连接&;HTTP重新连接-基本上尝试套接字连接)。当两个tcp重新连接线程&HTTP重新连接线程在一段时间后运行,TCP重新连接线程到达这一行:

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,它会超时。我很想知道这种行为的原因是什么?

更新:1)在MyHttpThreadProc中注释掉代码后,我无法重现错误。所以很明显,一些资源在winsock &导致这种奇怪行为的Wininet实现。

2)我尝试冻结HTTP重新连接线程(从ThreadWindow在Visual Studio 2012),它的TCP重新连接线程工作正常。这导致了以下探测:

p。S: 1)在应用程序级别,两者之间没有共享资源。

2)我怀疑是死锁,并继续在windbg(用户模式死锁)中调试,显示了9个临界区,但所有9个区都有lockcount值为NOT LOCKED。

3)我的另一个怀疑是使用WINSOCK &经由WININET在一起。我知道他们都使用mswsock.dll,它可能是一个loaderlock,导致内核死锁?关于发行债券。锁会遇到一些错误,所以我没有深入研究。

4)这是否属于线程冻结类别?有人能解释一下这种行为吗?

5)这个http://www.cpptalk.net/threadproc-does-not-run-when-createthread-is-called-within-vt7735.html是没有用的,因为我不使用一个单独的dll。

到目前为止似乎是一个挂在Http线程实现(当单独运行时),Wininet dll加载导致线程挂起/冻结。问题将被重新打开,如果挂在Http是固定的,类似的行为被模拟。