飞凌嵌入式ElfBoard-线程之线程分离

发布时间:2026/6/26 8:57:55

飞凌嵌入式ElfBoard-线程之线程分离 线程在POSIX标准中可以分为分离线程DETACHED和非分离线程JOINABLE两种它们的主要区别在于资源管理和退出状态的获取方式非分离线程JOINABLE线程在结束时不会自动释放其资源包括线程栈和线程控制块TCB因为操作系统需要保存这些信息以便其他线程能够获取其退出状态。需要调用 pthread_join() 函数来回收线程资源这一操作会阻塞调用者直到被连接的线程结束。适用于希望在线程退出时获取其退出状态或执行一些清理工作的情况。分离线程DETACHED分离线程在创建时设为分离状态或在运行时通过 pthread_detach() 将其设置为分离状态。线程退出后会自动释放所有相关资源操作系统直接清理不需要通过 pthread_join() 进行回收。由于分离线程退出时不保留退出状态其他线程无法通过 pthread_join() 获取其退出状态。适用于不需要获取线程退出状态的场合通常用于后台任务或不关心执行结果的线程。相对于非分离线程分离线程不需要其他线程来回收资源因为线程退出时系统会自动释放它的资源。更加独立线程结束时自动释放资源减少了线程管理的复杂度。不需要 pthread_join()适合那些无需返回值、也不需要其他线程等待的任务。可以减少内存泄漏的风险适合处理大量线程创建和终止的场景。pthread_detach()函数可以将非分离线程设置为分离线程。1.头文件#include pthread.h2.函数原型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.hvoid* 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 runningThread is running8.代码解析使用 pthread_create() 创建一个非分离线程。如果线程创建成功pthread_create() 会返回 0否则会返回非零值并输出错误信息。调用 pthread_detach() 将创建的线程设置为分离状态使得该线程在完成任务后自动释放资源避免了手动调用 pthread_join() 的需求。pthread_exit(NULL); 用于阻止主线程在其他线程执行完毕之前提前结束。pthread_exit() 只会终止主线程本身而不会影响分离线程的执行。

相关新闻