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

How to join threads created dynamically in c/c++

本文关键字:c++ 动态 创建 线程 何连接 连接      更新时间:2023-10-16

我写了一个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);
  }

如果你不关心线程的返回值,并且你对它们何时完成不感兴趣,那么你应该用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);

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

您将无法满足printf功能。

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

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

所以不要在while(1)中使用pthred_join,这样你的问题就会得到解决。

pthread_join在主进程希望等待线程完成作业时非常有用。