在下面的代码中,int sid=*(int*)args
构造的作用是什么?
void *thread_p(void *args)
{
int sid=*(int*)args,i,size=0;***This initialisation in the thread function means what?***
char msg[100];
while(1)
{
for(i=0;i<100;i++)
msg[i]='\0';
recv(sid,msg,100,0);
printf("\nClient:%s",msg);
printf("\nServer:");
gets(msg);
size=strlen(msg);
send(sid,msg,size,0);
if((strcmp(msg,"exit"))==0)
{
close(sid);
exit(1);
}
}
}
答案 0 :(得分:0)
我在这里假设thread_p是一个pthread_create启动例程。这样的启动例程需要接受一个void指针,它在C和C ++中表示指向无类型内存块的指针。现在,除了启动例程之外,pthread_create还接受一个void指针参数,并将其传递给start例程。 pthread_create的调用者可以使用start例程中的代码来协调对pthread_create的调用。因此,如果给pthread_create的启动例程假定void指针指向一个整数,则对pthread_create的调用必须将指向整数的指针作为arg参数传递,以使事物保持同步。这是一种类型不安全的界面。编译器不会帮助您确保它们是同步的,如果它们不同步,您将获得未定义的行为。
你的thread_p函数假设传递给它的arg实际上指向一个整数。它首先将void指针强制转换为整数指针(即(int *)args部分),然后取消引用指针以获取它指向的整数(即*(*)前面的* )参数)。如果pthread_create的调用者传递了thread_p,但是无法将int的地址作为arg参数传递,则代码将具有未定义的行为。