网站开发工期安排,建设银行租房平台网站6,semifinal,WordPress文章格式美化linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性
什么是分离属性#xff1f; 首先分离属性是线程的一个属性#xff0c;有了分离属性的线程#xff0c;不需要别的线程去接合… linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性
什么是分离属性 首先分离属性是线程的一个属性有了分离属性的线程不需要别的线程去接合自己的(回收自己的资源)。 a.线程的分离属性有两种分离态detached和非分离态joinable。
b.非分离态的线程只有在调用pthread_join之后才会完全释放自己所占用的资源可以用pthread_detach函数将线程修改为分离态分离态的线程在线程结束后由系统自动释放其所占用的所有资源 c.线程创建后默认属性是非分离态需要调用pthread_join释放线程所占用的资源
但是虽然说是分离的但是进程退出了该线程还是会退出的。 总结 设置了分离属性的线程 - 不需要pthread_join() 设置了非分离属性的线程 - 需要pthread_join() - 默认创建的普通属性线程就是非分离线程。 退出进程所有子线程都会消亡系统会回收他们资源。
如果设置为非分离属性的线程且不去回收子线程资源那么一个进程创建的子线程数据是有限请下面程序环境ubuntu20.04 64位
#include stdio.h
#include pthread.h
#include stdlib.h
#include unistd.h//定义退出的值为全局变量
int retval 10;//子线程
void *start_pthread(void *arg)
{int cnt 0;printf(arg:%ld\n, *((unsigned long *)arg));}int main(void)
{int cnt 0;unsigned long val 0;pthread_t thread_id;//主线程 运行时间比子线程时间长主线程运行退出后回收子线程资源while (1){//线程创建 非分离int ret pthread_create(thread_id, NULL, start_pthread, val);if(ret ! 0){printf(pthread_create fail\n);return -1;} val;}printf(接合子线程成功\n);return 0;}运行效果
如果不设置为分离属性主不回收子线程资源创建到32749条时创建线程失败
二、线程属性设置
线程属性设置通常有两个种一种是在创建前设置好分离属性别一个种是线程运行后再设置线程属性接下来先看第一种情况。
2.1 线程创建前设置分离属性
线程创建前设置分离属性就是添加一个分离属性到一个属性变量中然后使用属性变量去创建一个线程那么创建出来的线程就是具有分离属性的线程。 接下来看函数
1定义一个属性变量 - 数据类型pthread_attr_t
pthread_attr_t attr;2初始化属性变量。 - pthread_attr_init() - man 3 pthread_attr_init
#include pthread.h
int pthread_attr_init(pthread_attr_t *attr);参数 attr未初始化的属性变量 返回值 成功0 失败非0错误码 3设置分离属性到属性变量中。
#include pthread.h
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);参数 attr已经初始化过的属性变量 detachstate PTHREAD_CREATE_DETACHED - 分离属性 PTHREAD_CREATE_JOINABLE - 非分离属性 等同于 pthread_create(thread_id, NULL, start_pthread, val); 返回值 成功0 失败非0错误码 4使用属性变量去创建一个新的线程。
pthread_create(tid,attr,.....); - 创建出来的线程就是分离属性的线程不需要pthread_join()5销毁属性变量。 - pthread_attr_destroy() - man 3 pthread_attr_destroy
int pthread_attr_destroy(pthread_attr_t *attr);参数 attr已经初始化过的属性变量 返回值 成功0 失败非0错误码
案例代码
#include stdio.h
#include pthread.h
#include stdlib.h
#include unistd.h//定义退出的值为全局变量
int retval 10;//子线程有分离--不需要接合
void *start_pthread(void *arg)
{int cnt 0;printf(arg:%ld\n, *((unsigned long *)arg));}int main(void)
{int cnt 0;unsigned long val 0;pthread_t thread_id;//定义分享属性变量 pthread_attr_t attr;//初始化属性变量pthread_attr_init(attr);//设置线程属性--分离属性pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED);//主线程 运行时间比子线程时间长主线程运行退出后回收子线程资源while (1){//线程创建 分离属性int ret pthread_create(thread_id, attr, start_pthread, val);if(ret ! 0){printf(pthread_create fail\n);return -1;} val;}printf(接合子线程成功\n);return 0;}分离属性后的线程可以自动消亡主线程可以无限创建子线程。
2.2 线程创建后设置分离属性
先创建一个普通线程(分享属性设置为NULL, 默认的分享属性为不分离)然后在线程中调用一个设置分离属性的函数那么这个线程就变成分离的属性。 1设置线程本身的属性为分离属性。 - pthread_detach() - man 3 pthread_detach
#include pthread.h
int pthread_detach(pthread_t thread);函数作用 设置分离属性给线程 参数 thread需要设置分离属性的线程的ID号 返回值 成功0 失败非0错误码 2获取线程的ID号。 - pthread_self() - man 3 pthread_self
#include pthread.h
pthread_t pthread_self(void);参数 无 返回值线程的ID号。
案例
#include stdio.h
#include pthread.h
#include stdlib.h
#include unistd.h//子线程
void *start_pthread(void *arg)
{int cnt 0;//获取线程IDpthread_t thread_id pthread_self();//分离线程int ret pthread_detach(thread_id);if(ret ! 0){printf( pthread_detach fail\n);exit(0);}printf(arg:%ld\n, *((unsigned long *)arg));}int main(void)
{unsigned long val 0;pthread_t thread_id;//主线程 运行时间比子线程时间长主线程运行退出后回收子线程资源while (1){//线程创建 默认为非分离int ret pthread_create(thread_id, NULL, start_pthread, val);if(ret ! 0){printf(pthread_create fail\n);return -1;} val;}return 0;}设置了分离属性之后子线程可以无限被创建。