线程属性设置全攻略

目录

一、线程属性的概念

二、线程属性的核心函数

1. 初始化与销毁线程属性对象

2. 常用属性设置函数

三、线程属性的设置示例

1. 设置线程为分离状态

2. 设置线程栈大小

3. 设置线程调度策略和优先级

四、线程属性的关键注意事项

1. 分离状态(Detached State)

2. 栈大小(Stack Size)

3. 调度策略与优先级

4. 继承调度属性(Inherit Scheduler)

五、常见问题与解决方案

1. 线程栈溢出

2. 线程无法创建(资源不足)

3. 调度策略设置失败

六、线程属性设置的性能优化

七、总结


一、线程属性的概念

线程属性是 线程创建时可配置的参数,用于定制线程的行为和资源分配。通过设置线程属性,可以控制线程的栈大小、分离状态、调度策略、优先级等,从而优化程序性能和资源使用。


二、线程属性的核心函数

1. 初始化与销毁线程属性对象

#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
  • 作用
    • pthread_attr_init:初始化线程属性对象(默认值为系统默认属性)。
    • pthread_attr_destroy:释放线程属性对象占用的资源。

2. 常用属性设置函数

函数作用
pthread_attr_setdetachstate设置线程的分离状态(PTHREAD_CREATE_JOINABLE 或 PTHREAD_CREATE_DETACHED)。
pthread_attr_getdetachstate获取线程的分离状态。
pthread_attr_setstacksize设置线程的栈大小。
pthread_attr_getstacksize获取线程的栈大小。
pthread_attr_setschedpolicy设置线程的调度策略(如 SCHED_FIFOSCHED_RRSCHED_OTHER)。
pthread_attr_getschedpolicy获取线程的调度策略。
pthread_attr_setschedparam设置线程的调度参数(如优先级)。
pthread_attr_getschedparam获取线程的调度参数。
pthread_attr_setinheritsched设置线程是否继承创建者的调度策略(PTHREAD_INHERIT_SCHED 或 PTHREAD_EXPLICIT_SCHED)。
pthread_attr_getinheritsched获取线程的调度继承模式。

三、线程属性的设置示例

1. 设置线程为分离状态

#include <stdio.h>
#include <pthread.h>void* thread_function(void* arg) {printf("Thread is running.\n");return NULL;
}int main() {pthread_t thread_id;pthread_attr_t attr;// 初始化属性对象pthread_attr_init(&attr);// 设置分离状态pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);// 创建线程int ret = pthread_create(&thread_id, &attr, thread_function, NULL);if (ret != 0) {perror("pthread_create failed");return 1;}// 分离线程无需调用 pthread_joinprintf("Main thread continues.\n");// 销毁属性对象pthread_attr_destroy(&attr);return 0;
}

2. 设置线程栈大小

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>#define STACK_SIZE (1024 * 1024) // 1MB 栈大小void* thread_function(void* arg) {char buffer[1024 * 1024]; // 模拟栈使用printf("Thread is running.\n");return NULL;
}int main() {pthread_t thread_id;pthread_attr_t attr;void* stack = malloc(STACK_SIZE);if (!stack) {perror("malloc failed");return 1;}// 初始化属性对象pthread_attr_init(&attr);// 设置栈地址和大小pthread_attr_setstack(&attr, stack, STACK_SIZE);// 创建线程int ret = pthread_create(&thread_id, &attr, thread_function, NULL);if (ret != 0) {perror("pthread_create failed");free(stack);return 1;}// 等待线程结束pthread_join(thread_id, NULL);// 释放资源free(stack);pthread_attr_destroy(&attr);return 0;
}

3. 设置线程调度策略和优先级

#include <stdio.h>
#include <pthread.h>
#include <sched.h>void* thread_function(void* arg) {struct sched_param param;int policy;pthread_getschedparam(pthread_self(), &policy, &param);printf("Thread priority: %d, Policy: %d\n", param.sched_priority, policy);return NULL;
}int main() {pthread_t thread_id;pthread_attr_t attr;struct sched_param param;// 初始化属性对象pthread_attr_init(&attr);// 设置调度策略为 SCHED_FIFO(实时优先级)pthread_attr_setschedpolicy(&attr, SCHED_FIFO);// 设置调度继承模式为显式指定pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);// 设置优先级(需根据系统支持范围调整)param.sched_priority = 50;pthread_attr_setschedparam(&attr, &param);// 创建线程int ret = pthread_create(&thread_id, &attr, thread_function, NULL);if (ret != 0) {perror("pthread_create failed");return 1;}// 等待线程结束pthread_join(thread_id, NULL);// 销毁属性对象pthread_attr_destroy(&attr);return 0;
}

四、线程属性的关键注意事项

1. 分离状态(Detached State)

  • PTHREAD_CREATE_JOINABLE(默认):
    • 需要调用 pthread_join 回收资源。
    • 适用于需要获取线程返回值的场景。
  • PTHREAD_CREATE_DETACHED
    • 线程结束后自动释放资源。
    • 适用于无需等待线程结果的场景。

2. 栈大小(Stack Size)

  • 默认栈大小:通常为几 MB(依赖系统配置)。
  • 最小栈大小PTHREAD_STACK_MIN(通常为 2KB)。
  • 设置建议
    • 栈过小可能导致栈溢出。
    • 栈过大可能浪费内存,尤其在创建大量线程时。

3. 调度策略与优先级

  • 调度策略
    • SCHED_OTHER:默认策略,由系统动态调度。
    • SCHED_FIFO:先进先出的实时调度策略。
    • SCHED_RR:轮转调度的实时策略。
  • 优先级
    • 仅对 SCHED_FIFO 和 SCHED_RR 有效。
    • 需要 root 权限才能设置高优先级线程。
    • 优先级范围:sched_get_priority_min() 到 sched_get_priority_max()

4. 继承调度属性(Inherit Scheduler)

  • PTHREAD_INHERIT_SCHED(默认):
    • 线程继承创建者的调度策略和优先级。
  • PTHREAD_EXPLICIT_SCHED
    • 显式指定调度策略和优先级。

五、常见问题与解决方案

1. 线程栈溢出

  • 原因:栈空间不足,局部变量或递归调用过深。
  • 解决方案
    • 增加栈大小(pthread_attr_setstacksize)。
    • 避免在栈上分配大数组,改用堆内存。

2. 线程无法创建(资源不足)

  • 原因:系统资源限制(如最大线程数或内存不足)。
  • 解决方案
    • 减少单个线程的栈大小。
    • 使用 ulimit 调整系统限制(如 ulimit -s)。
    • 使用线程池管理线程生命周期。

3. 调度策略设置失败

  • 原因
    • 未启用实时调度策略(需 root 权限)。
    • 优先级超出系统支持范围。
  • 解决方案
    • 使用 sched_get_priority_min() 和 sched_get_priority_max() 查询合法范围。
    • 以 root 权限运行程序。

六、线程属性设置的性能优化

属性优化建议
栈大小根据线程需求调整,避免过大浪费或过小溢出。
分离状态对于短期任务使用 PTHREAD_CREATE_DETACHED,避免资源泄漏。
调度策略实时任务使用 SCHED_FIFO 或 SCHED_RR,普通任务使用默认策略。
优先级高优先级线程应谨慎使用,避免抢占系统关键资源。
继承调度属性显式设置调度属性可提高可控性,但需确保一致性。

七、总结

  • 线程属性设置 是多线程编程中的关键部分,直接影响线程的行为和资源使用。
  • 常用属性 包括分离状态、栈大小、调度策略和优先级。
  • 注意事项
    • 确保栈大小合理,避免溢出或浪费。
    • 优先级设置需符合系统权限和实时性需求。
    • 分离状态的选择应根据是否需要等待线程结果。
  • 错误处理:始终检查线程属性设置和创建函数的返回值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88596.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苍穹外卖-day06

苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 学习目标 能够使用HttpClient发送HTTP请求并解析响应结果 了解微信小程序开发过程 掌握微信登录的流程并实现功能代码 了解商品浏览功能需求 功能实现&#xff1a;微信登录、商品浏览 1. H…

安卓定制功能

未解决的定制功能 1.创建自定义分区 2.通过服务启动应用进程 3.应用白名单 4.网络白名单 5.应用锁 6.默认launcher 7.多主页动态切换 8.禁止状态栏下拉/锁屏页面禁止下拉状态栏&#xff08;两种一起&#xff09; 9.导航栏动态打开关闭 10.固件默认是手势还是导航栏 11.状态栏动…

【项目】GraphRAG基于知识图谱的检索增强技术-实战入门

GraphRAG—基于知识图谱的检索增强技术&#xff08;一&#xff09;GraphRAG入门介绍&#xff08;二&#xff09;GraphRAG基本原理回顾&#xff08;三&#xff09;GraphRAG运行流程3.1 索引&#xff08;Indexing&#xff09;过程3.2 查询&#xff08;Query&#xff09;过程3.3 P…

Zookeeper添加SASL安全认证 修复方案

#作者&#xff1a;任少近 文章目录1修复背景2 修复方案说明3 配置流程3.1停止zookeeper服务3.2Zookeeper添加SASL参数3.3配置jaas密码文件3.4 添加启动参数3.5启动zookeeper服务3.6访问测试4 Kafka连接zookeeper服务端配置4.1未配置身份认证4.2停止kafka服务4.3配置身份认证4.4…

AI进化论07:第二次AI寒冬——AI“改头换面”,从“AI”变成“机器学习”

书接上回&#xff0c;上回咱们聊了神经网络在第一次寒冬中的“蛰伏”与“萌动”。但别高兴太早&#xff0c;AI很快就迎来了它的第二次“寒冬”&#xff08;大概从20世纪80年代末到90年代中期&#xff09;。这次寒冬啊&#xff0c;比第一次还“冷”&#xff0c;还“漫长”。AI这…

基于开源AI智能名片链动2+1模式与S2B2C商城小程序的渠道选择策略研究

摘要&#xff1a;在数字化商业环境下&#xff0c;品牌与产品的渠道选择对其市场推广和运营成功至关重要。本文聚焦于如何依据自身品牌和产品特性&#xff0c;结合开源AI智能名片链动21模式与S2B2C商城小程序&#xff0c;运用科学的渠道选择方法&#xff0c;慎重挑选1 - 2个适宜…

开源 C# .net mvc 开发(八)IIS Express轻量化Web服务器的配置和使用

文章的目的为了记录.net mvc学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发文件系统&#xff0c;临时进行学习开发&#xff0c;系统上线3年未出没有大问题。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接: 开源 C# .net mvc 开…

PostgreSQL安装及简单应用

下载地址&#xff1a;EDB: Open-Source, Enterprise Postgres Database Management 安装 注意&#xff1a;端口号默认是5432 配置dbeaver应用&#xff0c;创建数据库和表 -- 创建模式&#xff08;如果不存在&#xff09; CREATE SCHEMA IF NOT EXISTS bbbase;-- 创建序列&…

wedo智能车库-----第31节(免费分享图纸)

夸克网盘&#xff1a;https://pan.quark.cn/s/10302f7bbae0 高清图纸源文件&#xff0c;需要的请自取

【springboot】IDEA创建SpringBoot简单工程(有插件)

需求 使用SpringBoot开发一个web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串 hello world~ 步骤 1.创建Maven工程 2.导入spring-boot-stater-web起步依赖 3.编写controller 4.提供启动类 pom.xml文件了解 启动类 新建包 创建类 package com.zw…

python正则表达式re(Regular Expression)

目录 正则表达式&#xff1a; match()函数&#xff1a; search()函数&#xff1a; findall()函数&#xff1a; 正则表达式的参数&#xff1a; 表示字符范围的参数&#xff1a; 表示字符出现的次数的参数&#xff1a; 表示同一类字符的参数&#xff1a; 贪婪和非贪婪模式…

事件驱动设计:Spring监听器如何像咖啡师一样优雅处理高并发

架构哲学&#xff1a;当咖啡店面对汹涌客流时&#xff0c;真正的优雅不是更快的动作&#xff0c;而是科学的协作机制。Spring事件驱动正是通过发布-订阅模式&#xff0c;让系统像顶级咖啡师般从容应对突发流量。一、从咖啡店看监听器本质&#xff1a;3大核心组件拆解 场景还原&…

C++ const 关键字解析

const 是 C 中用于定义常量或指定不可变性的关键字&#xff0c;它在不同上下文中有不同的含义和用法。下面是对 const 的全面解析&#xff1a;1. 基本用法定义常量const int MAX_SIZE 100; const double PI 3.14159;这些值在程序运行期间不能被修改必须在定义时初始化与指针结…

[es自动化更新] Updatecli编排配置.yaml | dockerfilePath值文件.yml

链接&#xff1a;https://github.com/elastic/elasticsearch/tree/main/build-conventions elasticsearch自动化更新 本专栏使用updatecli实现自动化版本更新与依赖管理。 其配置通过编排文件&#xff08;updatecli-compose.yaml&#xff09;实现&#xff0c;该文件罗列了称…

新手向:使用Python将多种图像格式统一转换为JPG

本文将详细解析一个专业的Python脚本&#xff0c;它能够将指定文件夹中的所有非JPG格式图像批量转换为JPG格式。这个脚本虽然代码量不大&#xff0c;但包含了文件操作、图像处理、异常处理等多个重要编程概念&#xff0c;非常适合初学者系统学习。环境准备在开始之前&#xff0…

深入剖析C++ RPC框架原理:有栈协程与分布式系统设计

深入剖析C RPC框架原理&#xff1a;有栈协程与分布式系统设计 &#x1f6e0;️ 第一部分&#xff1a;RPC框架核心原理与技术架构 &#x1f310; 1.1 RPC在分布式系统中的核心地位 远程过程调用&#xff08;RPC&#xff09;是现代分布式系统的基石&#xff0c;它实现了&#xf…

基于springboot+Vue的二手物品交易的设计与实现

基于springbootVue的二手物品交易的设计与实现 作者&#xff1a; Mr顺 | 某大厂全栈开发工程师 | CSDN新星计划导师 | Java领域优质创作者 技术栈&#xff1a; SpringBoot, JavaWeb, 数据库等。精通Java、微信小程序开发。 项目亮点&#xff1a; 完整可运行&#xff1a; 提供…

腾讯云轻量服务器创建快照免费API接口教程

接口简介 该API用于腾讯云轻量服务器系统盘快照创建&#xff0c;无需关机即可自动删除旧快照并创建新快照。特点包括&#xff1a; 不占用腾讯云快照配额支持自动备份策略适用于定时备份任务仅支持系统盘快照&#xff08;云硬盘需调用专用接口&#xff09; ​请求地址​ https…

C++中的智能指针(1):unique_ptr

一、背景普通指针是指向某块内存区域地址的变量。如果一个指针指向的是一块动态分配的内存区域&#xff0c;那么即使这个指针变量离开了所在的作用域&#xff0c;这块内存区域也不会被自动销毁。动态分配的内存不进行释放则会导致内存泄漏。如果一个指针指向的是一块已经被释放…

HTTPS安全机制:从加密到证书全解析

目录 1.HTTPS是什么 2.加密是什么 3.HTTPS的加密过程 3.1对称加密 3.2非对称加密 4.引入证书 4.1"中间人"攻击 4.2 引入证书机制 4.3 理解数据签名 4.4 非对称加密 对称加密 证书认证 5.常见问题 5.1 Fiddler等抓包工具&#xff0c;为啥能解析HTTPS的数据…