博客
关于我
Linux的POSIX线程属性
阅读量:792 次
发布时间:2023-02-04

本文共 2344 字,大约阅读时间需要 7 分钟。

创建POSIX线程的函数为:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,                   void *(*start_routine)(void *), void *arg);

第1个参数为线程句柄(类似于文件描述符),第3个参数为线程启动函数(输入void*、返回void*,因为指向任何结构体/基本数据类型的指针都可以被看作void*),第4个参数为传递给线程启动函数的参数。

第2个参数一般设置为NULL,此时采用默认的线程属性,但有需求时仍需设置线程属性。线程属性的设置需要谨慎操作,使用后需及时销毁。

以下是一个使用线程属性设置的示例:

// thread_attrib.c: 线程属性使用示例// 编译方式: gcc thread_attrib.c -pthread#include 
#include
#include
#include
#include
static inline void checkErrnum(int errnum, const char* msg) { if (errnum != 0) { fprintf(stderr, "%s error: %s\n", msg, strerror(errnum)); exit(1); }}static inline void* threadFunc(void* arg) { printf("%s\n", (char*) arg); return NULL;}int main() { int s; // 错误码 // 初始化线程属性 pthread_attr_t attr; s = pthread_attr_init(&attr); checkErrnum(s, "pthread_attr_init"); // 设置线程分离状态 s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); checkErrnum(s, "pthread_attr_setdetachstate"); // 创建线程 pthread_t tid; s = pthread_create(&tid, &attr, threadFunc, (void*) "Hello world!"); checkErrnum(s, "pthread_create"); // 销毁线程属性 s = pthread_attr_destroy(&attr); checkErrnum(s, "pthread_attr_destroy"); sleep(1); // main线程休眠,确保threadFunc函数能够执行完毕 return 0;}

需要注意的有:

  • 使用pthread_attr_init初始化线程属性后,传递给pthread_create时必须清理属性,否则可能导致资源泄漏。
  • 线程属性的设置方式较为复杂,通常需要结合man手册和pthread.h头文件进行深入学习。
  • 线程属性的设置涉及多个方面:

  • 分离状态:默认是JOINABLE,其他线程可以通过pthread_join等待该线程返回;设置为DETACHED后,该线程无法被连接。
  • 栈保护扩展:通过设置栈末尾保护机制,防止栈溢出。
  • 调度参数:包括调度策略(SCHED_OTHER、SCHED_FIFO、SCHED_RR)和调度优先级。
  • 调度继承:默认为INHERIT,线程继承父线程的调度属性;设置为EXPLICIT时,需显式指定调度策略和优先级。
  • 调度域:设置为SYSTEM时,线程与系统所有线程竞争资源;设置为PROCESS时,线程与进程内其他线程竞争资源。
  • 以下是线程属性相关函数的示例:

    // Detach stateenum {    PTHREAD_CREATE_JOINABLE,    PTHREAD_CREATE_DETACHED};// Stack size and addressint pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);// Scheduler policyint pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);// Inheritance modeenum {    PTHREAD_INHERIT_SCHED,    PTHREAD_EXPLICIT_SCHED};// Scope handlingenum {    PTHREAD_SCOPE_SYSTEM,    PTHREAD_SCOPE_PROCESS};

    通过合理设置线程属性,可以优化线程的行为和资源使用效率。

    转载地址:http://qpkfk.baihongyu.com/

    你可能感兴趣的文章
    linux用低权限运行定时任务,linux下定时任务
    查看>>
    Linux用户与用户组的操作
    查看>>
    linux用户与用户组管理
    查看>>
    Linux用户及用户组管理命令
    查看>>
    Linux用户和用户组详解
    查看>>
    Linux用户和组
    查看>>
    Linux用户如果没有root权限该如何安装依赖包,比如常用的gcc
    查看>>
    linux用户权限不够解析及解决方案
    查看>>
    Linux用户管理常用命令及对应配置文件
    查看>>
    linux用户管理的命令及手动添加用户
    查看>>
    linux用户管理:添加用户、设置密码、修改删除
    查看>>
    Linux病毒扫描与杀毒开源软件ClamAV详解(附Linux挖矿病毒源码研究分析样本)
    查看>>
    Linux的find命令使用指南及实际shell用例
    查看>>
    Linux的inode的理解
    查看>>
    linux的mysql主主_Mysql主主
    查看>>
    Linux的POSIX线程属性
    查看>>
    linux的pthread_self与gettid的返回值和开销的区别
    查看>>
    linux的shell命令的工作方式,Linux Shell命令的常用方法
    查看>>
    Linux的tree命令原来用处那么大,涨知识了!
    查看>>
    Linux的workqueue介绍
    查看>>