飞凌嵌入式ElfBoard-线程之线程分离
线程在POSIX标准中可以分为分离线程(DETACHED)和非分离线程(JOINABLE)两种,它们的主要区别在于资源管理和退出状态的获取方式;
非分离线程(JOINABLE):线程在结束时不会自动释放其资源,包括线程栈和线程控制块(TCB),因为操作系统需要保存这些信息,以便其他线程能够获取其退出状态。需要调用 pthread_join() 函数来回收线程资源,这一操作会阻塞调用者直到被连接的线程结束。适用于希望在线程退出时获取其退出状态或执行一些清理工作的情况。
分离线程(DETACHED):分离线程在创建时设为分离状态,或在运行时通过 pthread_detach() 将其设置为分离状态。线程退出后会自动释放所有相关资源,操作系统直接清理,不需要通过 pthread_join() 进行回收。由于分离线程退出时不保留退出状态,其他线程无法通过 pthread_join() 获取其退出状态。适用于不需要获取线程退出状态的场合,通常用于后台任务或不关心执行结果的线程。
相对于非分离线程,分离线程不需要其他线程来回收资源,因为线程退出时系统会自动释放它的资源。更加独立,线程结束时自动释放资源,减少了线程管理的复杂度。不需要 pthread_join(),适合那些无需返回值、也不需要其他线程等待的任务。可以减少内存泄漏的风险,适合处理大量线程创建和终止的场景。pthread_detach()函数可以将非分离线程设置为分离线程。
1.头文件
#include <pthread.h>
2.函数原型
int pthread_detach(pthread_t thread);
3.参数
pthread_t thread:线程的标识符,即要设置为分离状态的线程。
4.返回值
成功,返回 0。失败,返回错误码,可能的错误码包括:ESRCH:表示找不到指定的线程。EINVAL:指定的线程已经是分离状态,不能再次设置。
5.注意事项
1)必须在线程运行时调用:pthread_detach() 应在线程开始执行后调用,或者创建完线程后立刻调用。
2)避免重复设置:对同一个线程多次调用 pthread_detach() 会导致错误。
3)不可获取退出状态:一旦线程变为分离状态,就不能使用 pthread_join() 获取它的退出状态。
6.示例:通过pthread_detach()函数把线程非分离状态设置为分离状态
|
#include <stdio.h> #include <stdlib.h> #include <pthread.h> void* thread_function(void* arg) { printf("Thread is running\n"); pthread_exit(NULL); } int main() { pthread_t thread; // 创建非分离线程 if (pthread_create(&thread, NULL, thread_function, NULL) != 0) { perror("Failed to create thread"); return 1; } // 将线程设置为分离状态 if (pthread_detach(thread) != 0) { perror("Failed to detach thread"); return 1; } // 主线程继续执行 printf("Main thread is running\n"); // 不需要调用 pthread_join,因为线程已经是分离的 pthread_exit(NULL); // 保证主线程不会提前退出 return 0; } |
7.运行结果
|
Main thread is running Thread is running |
8.代码解析
使用 pthread_create() 创建一个非分离线程。如果线程创建成功,pthread_create() 会返回 0,否则会返回非零值,并输出错误信息。调用 pthread_detach() 将创建的线程设置为分离状态,使得该线程在完成任务后自动释放资源,避免了手动调用 pthread_join() 的需求。pthread_exit(NULL); 用于阻止主线程在其他线程执行完毕之前提前结束。pthread_exit() 只会终止主线程本身,而不会影响分离线程的执行。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)