我在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,那么一切都很好,但是当我使用线程来调用这个函数时它就是阻塞。建议??
答案 0 :(得分:1)
看看你的代码:
static void * Parse::parseRequest_helper(void *c)
{
cout<<"Inside Helper"; // Not coming here
return ((Parse *)c)->parseRequest(c);
}
只有传递给此函数的void *
参数是指向Parse
的指针才有意义。
void * Parse::parseRequest(void *info)
{
cout<<"Inside Parse Request"; //Not coming here
clientInfo *cInfo = (struct clientInfo *)info;
cout<<cInfo->ip;
}
只有传递给此函数的info
参数是指向clientInfo
的指针才有意义。
因为它是相同的参数,所以这段代码毫无意义。它可以是指向Parse
的指针,也可以是指向clientInfo
的指针,但不能同时指向两者。
cout<<"Inside Helper"; // Not coming here
您没有达到该行代码的结论是错误的。你是。你无法分辨,因为没有endl
因此缓冲区不会被刷新。
答案 1 :(得分:0)
您的代码没有任何内容可以向我们展示您的具体情况,但是根据您的意见,我对此有一些看法:
你说的是// after this while loop is terminating
,你的生产代码是否与此处相同,或者你真的终止了它的块?请记住,当您调用p.parseRequest(info)
时,您正在调用线程中的操作,因此在解析完成后,如果您使用线程,则在行(pthread_create(...)
)之后,指定的线程可能不是事件启动后,由OS安排的线程在以后运行,你不应该认为解析是在它之后完成的。
在行// this is not reachable
中你认为该行不应该执行吗?或者这是运行时代码的行为?在任何情况下pthread_create
都会立即返回,并在不同的执行线程中稍后运行作业,因此在您的代码中,您几乎可以立即调用sleep(0)
,然后确定到达指定的行!!
sleep(0)
是什么意思让线程开始或完成?在任何情况下OS调度基于内部算法的线程,所以在sleep(0)
之后,线程执行可能仍然未决!如果要确保线程已启动/停止,则必须在线程和主线程之间使用同步机制(例如互斥锁)