0

我在 C++ (linux) 中实现了一个多线程服务器。我的主要目标是使用线程调用函数将客户端详细信息发送到其他函数。这是我的代码片段:

while(true)
{

    if((acceptId = accept(sockId,(struct sockaddr*)&clientAddr,(socklen_t *)&address)) == -1)
            perror("Accept:");
    inet_ntop(clientAddr.ss_family,get_ip_address((struct sockaddr *)&clientAddr),ip1, sizeof(ip1));
    clientInfo *cInfo = new clientInfo;
    cInfo->acceptId = acceptId;
    strcpy(cInfo->ip, ip1);
    void *info = cInfo;
    pthread_t thread_request;
    pthread_create(&thread_request,NULL,&Parse::parseRequest_helper,info); // after this while loop is terminating
    //p.parseRequest(info);
    sleep(0);
    cout<<"\nserver: got connection from "<<ip1<<" Port:"<<clientport; // this is not reachable
}

// 这是我的 parseRequest() 函数的辅助函数,我正在调用我的 parseRequest 函数。

static void * Parse::parseRequest_helper(void *c)    
{

         cout<<"Inside Helper"; // Not coming here
     return ((Parse *)c)->parseRequest(c);
}

void * Parse::parseRequest(void *info)
{

    cout<<"Inside Parse Request";     //Not coming here
    clientInfo *cInfo = (struct clientInfo *)info;
        cout<<cInfo->ip;
}

如果我不使用线程并直接在 while 循环内调用 parseRequest,那么一切都很好,但是当我使用线程调用此函数时,它会阻塞。建议 ??

4

2 回答 2

1

看看你的代码:

static void * Parse::parseRequest_helper(void *c)    
{
     cout<<"Inside Helper"; // Not coming here
     return ((Parse *)c)->parseRequest(c);
}

void *仅当传递给此函数的参数是指向 a 的指针时,这才有意义Parse

void * Parse::parseRequest(void *info)
{

    cout<<"Inside Parse Request";     //Not coming here
    clientInfo *cInfo = (struct clientInfo *)info;
        cout<<cInfo->ip;
}

info仅当传递给此函数的参数是指向 a 的指针时,这才有意义clientInfo

由于它是相同的参数,因此此代码没有意义。它可以是指向 aParse的指针或指向 a 的指针clientInfo,但不能同时是两者。

     cout<<"Inside Helper"; // Not coming here

你没有得到那行代码的结论是不正确的。你是。您只是无法判断,因为没有endl缓冲区不会被刷新。

于 2012-10-12T07:17:40.883 回答
0

您的代码没有向我们展示您的情况的详细信息,但从您的评论中我有一些关于它的观点:

按照您所说// after this while loop is terminating的,您的生产代码是否与此处相同,或者您真的在它之后终止了您的块?请记住,当您调用时,p.parseRequest(info)您正在调用线程中执行操作,因此在您解析完成但如果使用线程之后,在 ( pthread_create(...)) 行之后,指定的线程可能没有事件启动,操作系统调度的线程在稍后,您不应该认为解析是在它之后完成的。

// this is not reachable你认为该行不应该执行吗?或者这是运行时代码的行为?在任何情况下pthread_create立即返回并稍后在不同的执行线程中运行作业,因此在您的代码中您几乎立即调用sleep(0)然后肯定会到达指定的行!

sleep(0)打算让线程启动或完成的原因是什么?在任何情况下,操作系统都会根据内部算法调度线程,因此之后sleep(0),线程执行可能仍然挂起!!如果要确保线程启动/停止,则必须在线程和主线程之间使用同步机制(例如互斥锁)

于 2012-10-12T05:47:08.113 回答