Socket不能跨线程

Socket不能跨线程

ID:37906277

大小:38.00 KB

页数:4页

时间:2019-06-02

Socket不能跨线程_第1页
Socket不能跨线程_第2页
Socket不能跨线程_第3页
Socket不能跨线程_第4页
资源描述:

《Socket不能跨线程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、现象用多线程方法设计socket程序时,你会发现在跨线程使用CAsyncSocket及其派生类时,会出现程序崩溃。所谓跨线程,是指该对象在一个线程中调用Create/AttachHandle/Attach函数,然后在另外一个线程中调用其他成员函数。下面的例子就是一个典型的导致崩溃的过程:CAsyncSocketSocket;UINTThread(LPVOID){Socket.Close();return0;}voidCTestSDlg::OnOK(){//TODO:AddextravalidationhereSocket.Create(0);AfxBeginThread(Thread,0

2、,0,0,0,0);}其中Socket对象在主线程中被调用,在子线程中被关闭。跟踪分析这个问题的原因可以通过单步跟踪(F11)的方法来了解。我们在Socket.Create(0)处设断点,跟踪进去会发现下面的函数被调用:voidPASCALCAsyncSocket::AttachHandle(SOCKEThSocket,CAsyncSocket*pSocket,BOOLbDead){_AFX_SOCK_THREAD_STATE*pState=_afxSockThreadState;BOOLbEnable=AfxEnableMemoryTracking(FALSE);if(!bDead){

3、ASSERT(CAsyncSocket::LookupHandle(hSocket,bDead)==NULL);if(pState->m_pmapSocketHandle->IsEmpty()){ASSERT(pState->m_pmapDeadSockets->IsEmpty());ASSERT(pState->m_hSocketWindow==NULL);CSocketWnd*pWnd=newCSocketWnd;pWnd->m_hWnd=NULL;if(!pWnd->CreateEx(0,AfxRegisterWndClass(0),_T("SocketNotificationSi

4、nk"),WS_OVERLAPPED,0,0,0,0,NULL,NULL)){TRACE0("Warning:unabletocreatesocketnotifywindow!");AfxThrowResourceException();}ASSERT(pWnd->m_hWnd!=NULL);ASSERT(CWnd::FromHandlePermanent(pWnd->m_hWnd)==pWnd);pState->m_hSocketWindow=pWnd->m_hWnd;}pState->m_pmapSocketHandle->SetAt((void*)hSocket,pSocket

5、);}else{intnCount;if(pState->m_pmapDeadSockets->Lookup((void*)hSocket,(void*&)nCount))nCount++;elsenCount=1;pState->m_pmapDeadSockets->SetAt((void*)hSocket,(void*)nCount);}AfxEnableMemoryTracking(bEnable);}在这个函数的开头,首先获得了一个pState的指针指向_afxSockThreadState对象。从名字可以看出,这似乎是一个和线程相关的变量,实际上它是一个宏,定义如下:#defi

6、ne_afxSockThreadStateAfxGetModuleThreadState()我们没有必要去细究这个指针的定义是如何的,只要知道它是和当前线程密切关联的,其他线程应该也有类似的指针,只是指向不同的结构。在这个函数中,CAsyncSocket创建了一个窗口,并把如下两个信息加入到pState所管理的结构中:pState->m_pmapSocketHandle->SetAt((void*)hSocket,pSocket);pState->m_pmapDeadSockets->SetAt((void*)hSocket,(void*)nCount);pState->m_hSocke

7、tWindow=pWnd->m_hWnd;pState->m_pmapSocketHandle->SetAt((void*)hSocket,pSocket);当调用Close时,我们再次跟踪,就会发现在KillSocket中,下面的函数出现错误:voidPASCALCAsyncSocket::KillSocket(SOCKEThSocket,CAsyncSocket*pSocket){ASSERT(CAsyncSocket::Loo

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。