博客
关于我
Linux的POSIX线程属性
阅读量:793 次
发布时间: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常用命令-grep
    查看>>
    linux常用命令100个(转)
    查看>>
    linux常用命令3
    查看>>
    linux常用命令date
    查看>>
    linux常用命令之打包压缩
    查看>>
    linux常用命令合集及常用工具指令集
    查看>>
    Linux常用命令总结
    查看>>
    Linux常用命令汇总
    查看>>
    Linux常用命令详解与示例
    查看>>
    linux常用命令:cal 命令
    查看>>
    Linux常用命令:touch
    查看>>
    Linux常用嗅探工具(1):fping命令
    查看>>
    linux常用基本命令
    查看>>
    linux常用快捷键
    查看>>
    Linux常用的网络命令有哪些?快速入门!
    查看>>
    linux常见命令
    查看>>
    linux常见操作命令及操作符意思
    查看>>
    Linux常见操作命令整理
    查看>>
    Linux平台安装mongoDB、配置及端口开启
    查看>>
    linux库列表
    查看>>