如何连接在c / c ++中动态创建的线程

时间:2013-07-23 15:56:44

标签: c++ c pthreads pthread-join

我编写了一个实现套接字连接的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);

  }

2 个答案:

答案 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非常有用。