如何连接在c/c++中动态创建的线程
How to join threads created dynamically in c/c++
我写了一个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在主进程希望等待线程完成作业时非常有用。
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- 在c++中使用动态分配的问题
- C++中的动态对象与非动态对象
- 如何在动态数组上使用搜索函数
- 视觉studo 2019中的漫画和静态/动态绑定
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁