C++ 如何连接在c/c++;

C++ 如何连接在c/c++;,c++,c,pthreads,pthread-join,C++,C,Pthreads,Pthread Join,我已经编写了一个C/C++代码,它实现了套接字连接,并且主线程在其端口进行连续循环监听。当连接请求到达这个端口时,我已经使用pthread调用生成了一个线程,并卸载了这个线程上的工作。因此,我为“n”个传入请求动态创建了“n”个线程。 问题是,如果一个线程终止,那么主线程也会终止 我使用了pthread_join(),但它会等待参数中的线程完成。在我的情况下,一旦调用pthread_join(),就不会生成新线程 如果您不关心线程的返回值,也不关心线程何时完成,那么您应该使用pthread_de

我已经编写了一个C/C++代码,它实现了套接字连接,并且主线程在其端口进行连续循环监听。当连接请求到达这个端口时,我已经使用pthread调用生成了一个线程,并卸载了这个线程上的工作。因此,我为“n”个传入请求动态创建了“n”个线程。 问题是,如果一个线程终止,那么主线程也会终止

我使用了pthread_join(),但它会等待参数中的线程完成。在我的情况下,一旦调用pthread_join(),就不会生成新线程


如果您不关心线程的返回值,也不关心线程何时完成,那么您应该使用
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);
添加
printf(“检查字符串”)pthread\u
之后的代码。现在编译并运行它。你可能会对你的问题有所了解

您将不会遇到printf函数

该行为的原因是
pthread\u join
将等待第一个创建的线程完成作业

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

因此,不要在
中使用
pthred\u join
,而(1)
则会解决您的问题


当主进程希望等待线程完成作业时,pthread_join最有用。

能否发布一个完整的示例,显示当子线程退出时主线程退出?请分离pthread,以便它完成后返回系统。您将需要一个pthread_t数组,而不仅仅是1。。。如果您尝试创建多个线程。如果他尝试使用池,他将需要一个数组。您是对的@ClydeByrdIII。假设他不需要任何返回值(看起来他不需要),分离就可以了,而且你也不需要数组。@simonc我不熟悉Berkeley socket的任何实现,其中套接字句柄不是整数。由于该整数是通过值传递给线程函数的——尽管是通过cast以
void*
的形式传递——因此无需担心重写。有可能
void*
无法存储所有可能的
int
值,但这种实现很少,而且在任何情况下,cast都出现在操作代码中-我没有介绍它。对不起,你是正确的。我读错了,认为传递的是局部变量的地址,而不是将句柄插入
void*
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);