回 帖 发 新 帖 刷新版面

主题:c++创建多线程传参数出现问题

这是一个代理程序
void* hThread = CreateThread(NULL, 0, TCPProxyThread,se, 0, &idthread);
        if (hThread == NULL)
        {
            cout<<"CreateThread() Error!"<<endl;
            return;
        }
为什么调用TCPProxyThread时参数se的内容就改变了,原先地址中有有效数据,而传过去之后就全部清零了?哪位大侠帮忙看看,有源程序,谢谢!
DWORD WINAPI TCPProxyThread(LPVOID param)
{
    ServiceStruct* psvc = (ServiceStruct*)param;
    DWORD id1,id2;
    void* hThread1 = CreateThread(NULL, 0, TCPClientToServer,psvc, 0, &id1);
    if (hThread1 == NULL)
    {
        cout<<"CreateThread() Error!"<<endl;
        return 1;
    }
    void* hThread2 = CreateThread(NULL, 0, TCPServerToClient, psvc, 0, &id2);
    if (hThread2 == NULL)
    {
        cout<<"CreateThread() Error!"<<endl; 
        return 1;
    }
    SuspendThread(GetCurrentThread());
    return 0;
}
DWORD WINAPI TCPServerToClient(LPVOID param) //server to client
{
    ServiceStruct* psvc = (ServiceStruct*)param;
    char buf[1024];
    int count;
    while (true)
    {
        count = recv(psvc->svctcp_server,buf,1024,0);
        SendBuffer(psvc->tcpsock,buf,count);
        int i;
        cin>>i;
        cout<<"TCPServerToClient:server "<<psvc->svctcp_server<<endl;
        cout<<"TCPServerToClient:client "<<psvc->tcpsock<<endl;
    }
}
DWORD WINAPI TCPClientToServer(LPVOID param) //client to server
{
    ServiceStruct* psvc = (ServiceStruct*)param;
    char buf[1024];
    int count;
    while (true)
    {
        count = recv(psvc->tcpsock,buf,1024,0);
        SendBuffer(psvc->svctcp_server,buf,count);
        int i;
        cin>>i;
        cout<<"TCPClientToServer:server "<<psvc->svctcp_server<<endl;
        cout<<"TCPClientToServer:client "<<psvc->tcpsock<<endl;
    }
}

回复列表 (共5个回复)

沙发

原先地址中有有效数据,而传过去之后就全部清零了
--- se指向的内容的生存期结束了呗,比如它是一个函数的局部变量

板凳

第一步:
DWORD WINAPI WorkingThread(LPVOID param)
{
    ServiceStruct svc;
    [color=FF00FF][i]int sock = *(int *)param;[/i][/color]
    svc.tcpsock = sock;
    GetRequest(svc);
    [i]ReplyRequest(svc);[/i]
    closesocket(sock);
    return 0;
}
第二步:
void ReplyRequest(ServiceStruct& svc)
{
    [i]ServiceStruct * se=&svc;[/i]    DWORD idthread;
    char reply[10];
    reply[0] = 0x04;
    reply[1] = 0x01;
    SendBuffer(se->tcpsock,reply,10);
    if (se->cmdtype == CONNECT)
    {
 /*     InitTCPSocket(svc.svctcp_client);
        sockaddr_in serveraddr;
        memset(&serveraddr,0x00,sizeof(sockaddr_in));
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_port   = htons(servicegListenSocket);
        serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
 /*       
        if (bind(svc.svctcp_client,(sockaddr*)&serveraddr,sizeof(serveraddr)) <0)
        {
      cout<<"Bind Error!"<<endl;
            return;
        }
        if (listen(svc.svctcp_client,MAX_QUEUE) < 0)
        {
      cout<<"Listen Error!"<<endl;
            return;
        }
*/      
        [i]void* hThread = CreateThread(NULL, 0, TCPProxyThread,se, 0, &idthread);[/i]        
        if (hThread == NULL)
        {
        cout<<"CreateThread() Error!"<<endl;
        return;
    }
    }
}
第三步:在这一步中传过来的se地址中的内容全部清零
DWORD WINAPI TCPProxyThread(LPVOID param)
{
   ServiceStruct* psvc = (ServiceStruct*)param;
   DWORD id1,id2;
   [i]void* hThread1 = CreateThread(NULL, 0, TCPClientToServer,psvc, 0, &id1);[/i]
你说生命期结束,不甚理解!能解释一下么?本人不吝赐分!

3 楼

难道是要进行类型的强制转换(LPVOID)se

4 楼

在创建线程传递附加参数的时候?

5 楼

深圳市华信群英科技有限公司与知名通信软件公司正式签订定向输送人才的合作协议
针对想进入IT软件行业的有志人士提供专业的企业内训
实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段
实训前就签订就业安置协议,岗前实训后入职
不仅学费优惠而且是企业定向培训定向招聘,百分百保证就业
有意向请登录www.szctt.com,或加QQ:1179397962做详细咨询

我来回复

您尚未登录,请登录后再回复。点此登录或注册