热情软件屋

 

多线程程序无法进行阻塞接收


编号: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回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio