请问高手,我这里用CreateThread想传入多个参数给次级线程该怎么传,如果用结构体指针封一下那不就会出现多线程之间的同步问题了么,所以只能以值传进去,那怎么弄呢
比如我想传一个SOCKET类型的值,和一个char类型的值给次级线程
hThread = CreateThread(NULL, 0, ClientThread, 
                    (LPVOID)????, 0, &dwThreadId);
DWORD WINAPI ClientThread(LPVOID lpParam)
该怎样修改这段函数???

解决方案 »

  1.   

    你可以根据你的需要写一个struct来保存你需要传递的参数
    struct yourParam{
     //....
    };yourParam * pParam = new yourParam;
    // prepare the parameter
    hThread = CreateThread(NULL, 0, ClientThread, 
                        (LPVOID)yourParam, 0, &dwThreadId);// 在线程中再取出还原
    yourParam * pClientParam = (yourParam*)plParam;// 注意使用完要删除
      

  2.   

    楼主:无论如何,你的一个socket不应该让多个线程同时使用的。如果你的多个线程可以同时使用一个socket的话,我的方法是没有问题的,因为每次创建线程都要分配一块新的内存,并且只被一个线程使用的
      

  3.   

    楼上,今天我做了个例子,按照传结构体的方式,但结果不对,不知什么原因,帮助看一下,谢谢
    typedef struct {
    SOCKET ConnectedSock;
    char flag[1];
    } Pstruct;DWORD WINAPI ClientThread(LPVOID lpParam)
    {
    Pstruct *InPstruct = (Pstruct * ) lpParam;
      //  printf("%d", InPstruct->ConnectedSock);  
    // SOCKET        sock=InPstruct->ConnectedSock;
      SOCKET mmsock = (SOCKET)lpParam;
      

  4.   

    我上面那一段用printf打出来的SOCKET号是-1,而我在线程外打出来的是292
    下面一段是线程外的函数
    Pstruct   *PtrStruct;
    PtrStruct = &tmpStruct;
    //在这里打出来的PtrStruct->ConnectedSock是292
     hThread = CreateThread(NULL, 0, ClientThread, 
                        (LPVOID)PtrStruct, 0, &dwThreadId);帮忙看一下,我现在是不知道问题在哪里了
      

  5.   

    跨线程使用socket, 在线程中必须初始化socket,否则不能正常使用而且,就像wanglei888(阿笨猫)说的那样,不论你有什么理由,都不应该在两个线程中使用同一个socket
      

  6.   

    如果你是要在新的线程中处理连接的话,就另当别论了,:)
    下面是一个服务端的事例代码,有些地方不完整int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        int nRetCode = 0;     AfxBeginThread(MTServerThread,0);
        while(_getch()!=27); // 'ESC' to cancel    closesocket(server);
        WSACleanup();    return nRetCode;
    }UINT  MTServerThread(LPVOID pParam)
    {
        if(listen(server,10)!=0)
        {
            return 0;
        }    SOCKET client;
        sockaddr_in from;
        int fromlen=sizeof(from);    while(true)
        {
            client=accept(server,(struct sockaddr*)&from,&fromlen);
            AfxBeginThread(ClientThread,(LPVOID)client);
        }     return 0;
    }UINT  ClientThread(LPVOID pParam)
    {
        SOCKET client=(SOCKET)pParam;    strcpy(buff,"#Server Ready.\r\n");
        send(client,buff,strlen(buff),0);    closesocket(client);
        return 0;
    }
      

  7.   

    这样是绝对没有问题的,我的程序就是在新的线程中处理连接,主要我是想把多个参数传入到新线程内部,使用这个结构体,其中的一个成员是一个SOCKET。难道这样不行么?
      

  8.   

    多谢上面两位支持 ,我的问题已经找到了,是我对线程的理解不对,总以unix下的fork进程的思维方式去理解。我的问题出在creatThread之后,就在主线程中return掉了,没有用一个while循环。结果次级线程空间被free掉了。当然怎么都不对了,欢迎大家继续讨论,明天结贴