我编写了一个实现套接字连接的C / C ++代码,主线程在其端口处进行连续循环监听。当连接请求来自此端口时,我使用pthread调用生成了一个线程并卸载了该线程上的工作。因此,我有'n'个线程为'n'传入请求动态创建。 问题是,如果一个线程终止,主线程也会终止。
我已经使用了pthread_join()但它等待参数中的线程完成。在我的情况下,一旦调用pthread_join(),新线程就不会产生。
pthread_t t;
while(1) //server always to be in listen mode
{
client_len=sizeof(client_sockaddr);
client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_sockaddr,&client_len);
pthread_create(&t,NULL,server_thread,(void*)client_sockfd);
(void)pthread_join(t,NULL);
}
答案 0 :(得分:3)
如果您不关心线程的返回值,并且您对完成时不感兴趣,那么您应该使用pthread_detach
将它们分离,或者只是以分离状态创建它们以开始:
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
while(1) //server always to be in listen mode
{
client_len=sizeof(client_sockaddr);
client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_sockaddr,&client_len);
pthread_t t;
pthread_create(&t,&thread_attr,server_thread,(void*)client_sockfd);
}
pthread_attr_destroy(&thread_attr);
答案 1 :(得分:0)
在代码中printf("check string\n");
之后添加pthread_join
。现在编译并运行它。你可能会对你的问题有所了解。
您将无法满足printf功能。
行为的原因是pthread_join
将等待第一个创建的线程完成作业。
所以除非并且直到第一个线程完成作业,否则不会创建新线程。因此,您的代码将不接受任何新的客户端连接。
所以不要在pthred_join
内使用while(1)
,那么您的问题就会得到解决。
当主进程想要等到线程完成作业时,pthread_join非常有用。