做行业网站广告中考复读学校网站怎么做
2026/4/6 5:59:29 网站建设 项目流程
做行业网站广告,中考复读学校网站怎么做,网页游戏传奇霸主攻略,seo短期课程作为编程初学者#xff0c;学完基础的线程创建#xff08;pthread_create#xff09;后#xff0c;遇到了 “批量配置线程特征” 的场景 —— 比如让线程自动释放资源、调整线程调度优先级#xff0c;这时线程属性#xff08;pthread_attr_t#xff09;就派上用场了学完基础的线程创建pthread_create后遇到了 “批量配置线程特征” 的场景 —— 比如让线程自动释放资源、调整线程调度优先级这时线程属性pthread_attr_t就派上用场了整理核心知识点和实战代码如下一、核心特点1. 适用场景批量创建线程统一配置线程特征脱离状态、调度策略、优先级等避免线程创建时硬编码配置提升代码灵活性和可维护性需精细化控制线程运行规则如实时线程的调度优先级。2. 核心逻辑线程属性本身不控制线程运行而是为 pthread_create 提供统一的配置模板核心流程初始化属性 → 设置特征属性 → 创建线程 → 销毁属性属性销毁后不影响已创建的线程仅释放属性结构体资源。二、关键接口接口功能关键说明pthread_attr_init动态初始化线程属性attr属性变量指针成功返回 0失败返回错误码pthread_attr_destroy销毁线程属性释放属性资源销毁后可重新初始化成功返回 0pthread_attr_setdetachstate设置线程脱离状态可选值① PTHREAD_CREATE_DETACHED脱离态线程结束自动释放资源主线程不可 pthread_join② PTHREAD_CREATE_JOINABLE默认主线程可 pthread_joinpthread_attr_getdetachstate获取线程脱离状态存入 detachstate 指针用于校验属性配置结果pthread_attr_setschedpolicy设置调度策略可选值① SCHED_OTHER默认普通调度无实时性② SCHED_FIFO实时 FIFO需 sudo 运行③ SCHED_RR实时轮转需 sudo 运行pthread_attr_getschedpolicy获取调度策略存入 policy 指针校验调度策略配置sched_get_priority_max/min获取优先级范围配合调度策略使用SCHED_OTHER 优先级固定为 0SCHED_FIFO/RR 为 1~99pthread_attr_setschedparam设置线程优先级需传入 sched_param 结构体含 sched_priority仅对实时策略有效重点脱离状态核心逻辑脱离态DETACHED线程结束后自动释放资源主线程无需 pthread_join适合批量创建的无关联线程可连接态JOINABLE默认状态主线程需 pthread_join 回收资源否则会产生 “僵尸线程”。三、实战代码示例 1脱离状态属性核心常用模拟创建 “脱离态” 线程线程结束自动释放资源主线程通过共享变量等待线程结束#include stdio.h #include unistd.h #include stdlib.h #include pthread.h int finished 0; // 共享变量判断线程是否结束 void* thread_function(void* arg) { printf(线程开始运行...\n); int count (int)arg; for (int i 0; i count; i) { printf(线程正在工作第%d次\n, i 1); sleep(1); } printf(线程即将关闭.\n); finished 1; pthread_exit(NULL); } int main() { pthread_attr_t thread_attr; int res; // 1. 初始化线程属性 res pthread_attr_init(thread_attr); if (res ! 0) { perror(pthread_attr_init failed); exit(1); } // 2. 设置为脱离状态核心 res pthread_attr_setdetachstate(thread_attr, PTHREAD_CREATE_DETACHED); if (res ! 0) { perror(Setting detached attribute failed); exit(EXIT_FAILURE); } // 3. 创建线程传入配置好的属性 pthread_t a_thread; int n 3; // 线程工作次数 res pthread_create(a_thread, thread_attr, thread_function, (void*)n); if (res ! 0) { perror(Thread creation failed); exit(EXIT_FAILURE); } // 4. 销毁属性不影响已创建线程 pthread_attr_destroy(thread_attr); // 脱离状态下无法pthread_join用共享变量等待 while (!finished) { printf(等待线程结束...\n); sleep(1); } printf(线程已结束\n); return 0; }示例 2调度策略 优先级属性配置线程调度策略为默认SCHED_OTHER并设置优先级仅演示流程实时策略需 sudo 运行#include stdio.h #include unistd.h #include stdlib.h #include pthread.h #include sched.h int finished 0; void* thread_function(void* arg) { printf(线程开始运行...\n); int count (int)arg; for (int i 0; i count; i) { printf(线程正在工作第%d次\n, i 1); sleep(1); } printf(线程即将关闭.\n); finished 1; pthread_exit(NULL); } int main() { pthread_attr_t thread_attr; int res; // 1. 初始化属性 res pthread_attr_init(thread_attr); if (res ! 0) { perror(pthread_attr_init failed); exit(1); } // 2. 设置脱离状态 res pthread_attr_setdetachstate(thread_attr, PTHREAD_CREATE_DETACHED); if (res ! 0) { perror(Setting detached attribute failed); exit(EXIT_FAILURE); } // 3. 设置调度策略SCHED_OTHER/SCHED_FIFO/SCHED_RR res pthread_attr_setschedpolicy(thread_attr, SCHED_OTHER); if (res ! 0) { perror(pthread_attr_setschedpolicy failed); exit(1); } // 4. 获取优先级范围并设置 int max_priority sched_get_priority_max(SCHED_OTHER); int min_priority sched_get_priority_min(SCHED_OTHER); printf(SCHED_OTHER优先级范围%d ~ %d\n, min_priority, max_priority); struct sched_param scheduling_value; scheduling_value.sched_priority min_priority; // SCHED_OTHER仅能设0 res pthread_attr_setschedparam(thread_attr, scheduling_value); if (res ! 0) { perror(pthread_attr_setschedparam failed); exit(1); } // 5. 创建线程 pthread_t a_thread; int n 3; res pthread_create(a_thread, thread_attr, thread_function, (void*)n); if (res ! 0) { perror(Thread creation failed); exit(EXIT_FAILURE); } // 6. 销毁属性 pthread_attr_destroy(thread_attr); // 等待线程结束 while (!finished) { printf(等待线程结束...\n); sleep(1); } printf(线程已结束\n); return 0; }四、编译运行线程属性依赖 pthread 库编译时必须加-lpthread# 编译脱离状态示例 gcc thread_attr_detach.c -o thread_attr_detach -lpthread # 运行 ./thread_attr_detach # 编译调度策略示例实时策略需sudo gcc thread_attr_sched.c -o thread_attr_sched -lpthread # 普通策略运行 ./thread_attr_sched # 实时策略如SCHED_FIFO需sudo sudo ./thread_attr_sched五、踩坑初始化属性前使用未调用 pthread_attr_init 直接设置属性导致程序崩溃或配置无效脱离态线程调用 pthread_joinpthread_join 返回错误无法等待线程结束实时调度策略未用 sudo 运行SCHED_FIFO/SCHED_RR 配置失败无权限修改调度策略SCHED_OTHER 设置非 0 优先级优先级配置无效SCHED_OTHER 仅支持优先级 0属性销毁后重复使用销毁后未重新初始化直接设置属性导致配置失败忽略接口返回值未校验 pthread_attr_setXXX 的返回值配置失败后无感知。六、总结线程属性是 “线程配置的统一模板”核心价值在于批量、灵活配置线程特征脱离状态解决 “僵尸线程” 问题批量创建线程时优先使用 DETACHED调度策略普通场景用 SCHED_OTHER实时场景如工控、音视频用 SCHED_FIFO/RR核心原则属性仅影响创建时的线程销毁不影响已运行线程需配合互斥锁 / 条件变量完成复杂同步。对比直接传 NULL 给 pthread_create默认属性线程属性让线程配置更清晰、可维护是 Linux 线程进阶编程的必备知识点。

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

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

立即咨询