多线程程序无法进行阻塞接收
编号:QA003531
建立日期: 2000年11月13日 最后修改日期:2000年11月13日
所属类别:
飞蛾:
操作系统: Windows
编程工具: VC
问题: 在主进程中的异步监听SOCKET(CAsyncSocket m_MainAsyncS)在监听到请求后,建立处理子线程(CWinThread m_SubThread), 并将子线程中的一个成员变量:阻塞SOCKET(CSocket SubSocket)直接作为Accept的参数(m_MainAsyncS.Accept(m_SubThread->SubSocket)), 在DEBUG中, 激活子线程后该阻塞SOCKET可以发送数据(m_SubThread.Send(sBuffer,sizeof(sBuffer))),但无法做阻塞接收(m_SubThread.Recive(rBuffer,sizeof(rBuffer),0)),如果在同一线程中(如都在主线程中)就不存在这样的问题,在DEBUG中给出的错误提示是:"File sockcore.cpp Line:850"编译(DEBUG模式)后给出的错误提示是:"File sockcore.cpp Line:336",不知怎么解决,请教高手。
水平: 中级
回答:
首先是不应该在父进程中操作线程成员,因为WINDOWS的多任务特性使得线程之间独立运行,但是它们彼此共享虚拟空间。所以线程有可能会同时操作一片内存,类对象也是一片内存区域,这时会产生意外问题。如果要共同操作一个大尺寸变量你必须做好线程的同步。
你可以如下做试试:
CSocket *m_SubSocket;
m_SubSOcket=new CSocket;
MainSocket->Accetp(*m_SubSocket);
把m_SubSocket做为参数,在子线程启动时传递
AfxBeginThread(SubThread,(LPVOID)m_SubSocket)
也可以把套接口描述符作为参数。
还有要注意的是阻塞的socket调用必须考虑客户端的收发,如果客户端正处与接收阻塞,服务端也就没法接收了,而且线程的结束也很危险。
此问题由four回答。
| |
|
|
| |
|
|