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之一。 其实不光是不能再创建线程了, 资源得不到释放的话, 内存也会随之线性疯狂增长。

猜你喜欢

转载自blog.csdn.net/weixin_38176039/article/details/81511531
今日推荐