Linux 线程创建设置属性

在项目中读到一段代码如下

static void output_wifi_connecte_network(void *param)
{
     pthread_t tid;
     pthread_attr_t attr;
 
     pthread_attr_init(&attr);
     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 
     int error = pthread_create(&tid, &attr, output_wifi_connecting_internal_thread_loop,
             param);
 
     pthread_attr_destroy(&attr);
 
     if (error) {
         printf("Error: Failed to create pthread(%d)\n", errno);
     }
 }

看的出来是一个很简单的进程创建,但是我发现pthread_create()的第二个参数我一直都是填的NULL,百度过后得到答案第二个参是设置新创建线程的属性的 , 可以设置的属性如下:

属性对象主要包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分离、缺省的堆栈、与父进程同样级别的优先级。

结合上面的代码, 我们发现进程创建完成后,并没有调用pthread_join()函数,所以说设置线程属性为PTHREAD_CREATE_DETACHED(分离)的目的就是线程结束后能够释放掉资源。

 

在pthread_join manul 的DESCRIPTION 中:"It is unspecified whether a thread that has exited but remains unjoined countsagainst {PTHREAD_THREADS_MAX}".

意思是当一个线程被创建时是可汇合(绑定)的joinable(默认的attribution), 其他线程或父线程有没有调用pthread_join去做相关资源都被释放(pthread id等), 该线程运行结束后资源就得不到释放,所在进程的pthread id数目就可能会累积到达最大数目PTHREAD_THREADS_MAX,此时系统就不能再创建线程了,因为pthread id等资源被用光了,这是在多线程编程中很常见的bug之一。 其实不光是不能再创建线程了, 资源得不到释放的话, 内存也会随之线性疯狂增长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值