c++ ThreadProc没有被调用,尽管CreateThread成功
c++ ThreadProc not Invoked inspite of CreateThread Succeeding
我有一个同时使用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是固定的,类似的行为被模拟。
- C++中的赋值发生,尽管右侧出现异常
- C++为什么尽管我调用了void函数,它却不起作用
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- 尽管遵循了规则,内存泄漏在哪里
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 未定义的引用,尽管存在符号,但 std::experimental::可选
- 尽管一切看起来都很好,但值不会交换
- imread() 仍然返回空垫子,尽管在 openCV 4.0.0 中寻址正确
- 如何定义和声明,尽管它被定义和声明?
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 尽管条件为真,循环仍停止
- 未解析的外部,尽管没有外部库
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- 尽管直接设置了指针数组,但仍为空
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- openCL 内核返回垃圾值,尽管没有错误
- c++ ThreadProc没有被调用,尽管CreateThread成功