网站建设的基本原则小程序注册后如何注销
2026/1/8 16:56:35 网站建设 项目流程
网站建设的基本原则,小程序注册后如何注销,网站管理员有哪些权限,有没有专门做飞卢小说盗版的网站一、前言前面我们学习了线程的一些基础知识#xff0c;学习了线程的创建与使用#xff0c;今天我们来学习线程的分离与同步。二、线程分离2.1、函数原型函数原型如下#xff1a;#include pthread.h int pthread_detach(pthread_t thread);参数#xff1a;thread学习了线程的创建与使用今天我们来学习线程的分离与同步。二、线程分离2.1、函数原型函数原型如下#include pthread.h int pthread_detach(pthread_t thread);参数thread设置为分离态的线程 ID用户态 TID由 pthread_create() 返回的 ID。返回值成功返回0失败返回对应的错误码。2.2、工作原理pthread_detach()本质是修改线程的分离状态属性通知内核该线程终止时无需保留资源等待pthread_join()自动回收资源具体执行流程如下1、用户态方面pthread库修改该线程对应的属性结构体pthread_attr_t中detachstate字段为PTHREAD_CREATE_DETACHED2、内核态层面 库通过系统调用通知内核标记该线程的 task_struct任务结构体为 “分离态”3、线程终止时内核检测到分离态标记会立即清理线程的栈、寄存器、TID 等资源无需主线程干预。注分离操作不影响线程的执行仅改变线程终止后的资源回收规则。2.3、典型示例1、先创建再detach先创建一个pthread_detach.c文件然后输入以下代码#include stdio.h #include pthread.h #include unistd.h #include string.h void *myfun(void *arg) { printf(child pthread id is %ld\n,pthread_self()); for(int i0;i5;i) { printf(children i %d\n,i); sleep(1); } return NULL;//子线程结束自动回收资源并退出 } int main() { pthread_t pthid; int ret; ret pthread_create(pthid,NULL,myfun,NULL);//线程创建 pthread_detach(pthid);//线程分离 if(ret ! 0) { printf(error number is %d\n,ret); printf(%s\n,strerror(ret)); } printf(parent pthread id is %ld\n,pthread_self()); for(int i0;i5;i) { printf(parent i %d\n,i); sleep(1); } sleep(2);//休眠2s防止主线程快速退出导致进程退出 return 0; }使用gcc编译器进行编译运行结果如下可以看到主线程并不会等待子进程子进程在后台跑子线程自动释放资源这就是线程分离的目的。2、创建时直接设置为分离态有时不想手动设置分离态可以让线程创建时直接分离具体代码如下#include stdio.h #include pthread.h #include unistd.h #include string.h void *myfun(void *arg) { printf(child pthread id is %ld\n,pthread_self()); for(int i0;i5;i) { printf(children i %d\n,i); sleep(1); } return 0; } int main() { pthread_t pthid; pthread_attr_t attr; //init pthread_attr_init(attr);//初始化线程属性对象 //set pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);//设置线程为分离态 //set2 int ret; ret pthread_create(pthid,attr,myfun,NULL);//创建线程并使其天生就是分离状态 pthread_detach(pthid); if(ret ! 0) { printf(error number is %d\n,ret); printf(%s\n,strerror(ret)); } printf(parent pthread id is %ld\n,pthread_self()); for(int i0;i5;i) { printf(parent i %d\n,i); sleep(1); } sleep(2); //kill attr pthread_attr_destory(attr);//销毁属性对象不影响已经创建的线程 return 0; }使用gcc编译器进行编译运行结果如下运行结果与第一种方法一样但是这是创建时直接分离避免了线程创建失败而导致后续分离操作无效的情况。2.4、注意事项1、分离状态不可逆线程一旦通过 pthread_detach 设为分离态无法再改回joinable状态。如果后续试图调用 pthread_join会直接返回 EINVAL 错误。2、调用时机越早越好避免线程提前终止若主线程创建子线程后还没来得及调用 pthread_detach子线程就已经终止此时调用 pthread_detach 会返回 ESRCH找不到线程3、不能对已终止的线程调用pthread_detach线程终止后其 TID 可能被内核复用分配给新创建的线程此时调用 pthread_detach 可能误操作新线程导致不可预期的问题。4、分离线程崩溃仍会导致进程终止pthread_detach 仅改变资源回收方式不改变线程与进程的资源共享关系如果分离线程触发段错误、除零等异常仍会发送信号终止整个进程。5、主线程提前退出仍会杀死分离线程分离线程只是 “终止后自动回收资源”但如果主线程直接return/exit导致进程终止所有分离线程仍会被强制杀死需主线程 pthread_exit或延时等待。6、不能同时调用 pthread_join 和 pthread_detach若先调用 pthread_join阻塞等待线程此时再调用 pthread_detach 会返回 EINVAL若先调用 pthread_detach 分离线程再调用 pthread_join也会返回 EINVAL7、主线程无需分离无意义主线程的 TID 等于进程 PID分离主线程不会改变 “主线程退出导致进程终止” 的规则因此对主线程调用 pthread_detach无实际意义还可能返回 EINVAL 错误。2.5、两种创建方法对比二者对比如下特性pthread_detach()动态分离pthread_attr_setdetachstate()静态创建调用时机线程创建后任意时间需线程未终止线程创建前初始化属性时灵活性高运行时决定是否分离低创建前确定无法动态调整代码复杂度低无需初始化属性结构体高需初始化 / 销毁属性结构体风险可能因线程提前终止导致调用失败无此风险创建时直接设为分离态适用场景运行时才确定是否分离的场景提前确定无需等待的后台线程

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询