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