分类目录归档:程序语言

MFC 线程的一个问题

我们公司的服务器程序一直运行得很好,但在用户一台特别高配置(2G内存,8CPU)的机器上出问题了。根据Drwtsn32的输出,查出来问题出在MFC中thrdcore.cpp中第59行

44:UINT APIENTRY _AfxThreadEntry(void* pParam)
45:{
46:??? _AFX_THREAD_STARTUP* pStartup = (_AFX_THREAD_STARTUP*)pParam;

58:??? ??? _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
59:??? ??? pThreadState->m_pModuleState = pStartup->pThreadState->m_pModuleState;

出错时,pStartup->pThreadState 已经是非法值了,而pStartup是作为线程处理函数的参数传入并赋值的。

再看调用_AfxThreadEntry的地方:

385: BOOL CWinThread::CreateThread(DWORD dwCreateFlags, UINT nStackSize,
386:??? LPSECURITY_ATTRIBUTES lpSecurityAttrs)
387:{

398:??? _AFX_THREAD_STARTUP startup; memset(&startup, 0, sizeof(startup));
399:??? startup.pThreadState = AfxGetThreadState();

414:??? // create the thread (it may or may not start to run)
415:??? m_hThread = (HANDLE)_beginthreadex(lpSecurityAttrs, nStackSize,
416:??? ??? &_AfxThreadEntry, &startup, dwCreateFlags | CREATE_SUSPENDED, (UINT*)&m_nThreadID);

问题就可能出在startup是个局部变量,当_AfxThreadEntry尚未执行完毕时,有可能CWinThread::CreateThread()很快完成退出,导致startup内容被更改。特别是在多CPU的机器上,可能性更大?

不用MFC的线程,直接用C库函数_beginthread,解决此问题。折腾了好几天。