某时之前,我认为在unix下面所谓释放线程,就是在线程处理函数完成退出。
因此线程程序就如下了:
#include <pthread.h>
#include <stdio.h>
void * func(void * arg)
{
pthread_exit(0);
return 0;
}
int main(int argc, char ** argv)
{
pthread_t pt_id;
if(0 != pthread_create(&pt_id, NULL, func, NULL))
{
printf("pthread_create error/n");
}
return 0;
}
直到,我们的网络服务器在客户端频繁断开、链接...,终于出现了创建线程失败。
翻看资料发现,“在默认情况下,线程终止状态会保存到对该线程调用pthread_join,如果线程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被收回...pthread_detach调用可以用户使线程进入分离状态。”
于是,要线程处理函数退出时,线程资源立即被回收,那么就应该使线程处于分离状态。
线程相干代码修改如下:
#include <pthread.h>
#include <stdio.h>
void * func(void * arg)
{
pthread_detach(pthread_self());
pthread_exit(0);
return 0;
}
int main(int argc, char ** argv)
{
int i = 0;
for(; i < atoi(argv[1]); ++i)
{
pthread_t pt_id;
if(0 != pthread_create(&pt_id, NULL, func, NULL))
{
printf("server_accept::pthread_create/n");
}
}
return 0;
}
测试,问题解决了。
因此线程程序就如下了:
#include <pthread.h>
#include <stdio.h>
void * func(void * arg)
{
pthread_exit(0);
return 0;
}
int main(int argc, char ** argv)
{
pthread_t pt_id;
if(0 != pthread_create(&pt_id, NULL, func, NULL))
{
printf("pthread_create error/n");
}
return 0;
}
直到,我们的网络服务器在客户端频繁断开、链接...,终于出现了创建线程失败。
翻看资料发现,“在默认情况下,线程终止状态会保存到对该线程调用pthread_join,如果线程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被收回...pthread_detach调用可以用户使线程进入分离状态。”
于是,要线程处理函数退出时,线程资源立即被回收,那么就应该使线程处于分离状态。
线程相干代码修改如下:
#include <pthread.h>
#include <stdio.h>
void * func(void * arg)
{
pthread_detach(pthread_self());
pthread_exit(0);
return 0;
}
int main(int argc, char ** argv)
{
int i = 0;
for(; i < atoi(argv[1]); ++i)
{
pthread_t pt_id;
if(0 != pthread_create(&pt_id, NULL, func, NULL))
{
printf("server_accept::pthread_create/n");
}
}
return 0;
}
测试,问题解决了。