3

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

  }
4

2 回答 2

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);
于 2013-07-23T16:04:56.253 回答
0

在您的代码中添加printf("check string\n");之后。pthread_join现在编译并运行它。您可能会对您的问题有所了解。

你不会遇到 printf 函数。

该行为的原因是pthread_join将等待第一个创建的线程完成工作。

因此,除非并且直到第一个线程完成作业,否则不会创建新线程。所以你的代码不会接受任何新的客户端连接。

所以不要在你的pthred_join里面使用while(1)那么你的问题就会得到解决。

当主进程想要等到线程完成作业时,pthread_join 最有用。

于 2013-07-23T17:08:57.127 回答