美文网首页
C++ Linux多线程:各种线程属性和对它们做相关操作的函数

C++ Linux多线程:各种线程属性和对它们做相关操作的函数

作者: wangawu121 | 来源:发表于2020-10-28 20:47 被阅读0次

线程属性

pthread_attr_t 结构体定义了一套完整的线程属性:

#include <bits/ pthreadtypes.h>
#define __SIZEOF_PTHREAD_ATTR_T 36
typedef union
{
    char __size[__SIZEOF_PTHREAD_ATTR_T];
    long int __align;
} pthread_attr_t;

可以看到,各种线程属性都包含在一个字符数组中

各个线程属性的含义和相关函数

线程库定义了一系列函数来操作 pthread_attr_t 类型的变量,以方便我们获取和设置线程属性。

用于初始化和销毁 pthread_attr_t 类型变量的两个函数如下:

#include <pthread.h>
/* 初始化线程属性对象 */
int pthread_attr_init( pthread_attr_t* attr );
/* 销毁线程属性对象,被销毁的线程属性对象只有再次初始化后才能继续使用 */
int pthread_attr_destory( pthread_attr_t* attr );

各个线程属性以及对其相关操作的函数如下:

  • detachstate 线程脱离状态

    可选值:

    PTHREAD_CREATE_JOINABLE:指定线程是可以被回收的

    PTHREAD_CREATE_DETACH:使调用线程脱离与进程中其他线程的同步

    脱离了与其他线程同步的线程成为“脱离线程”,脱离线程将在退出时自行释放其占用的系统资源

    线程创建时属性的默认值是 PTHREAD_CREATE_JOINABLE,可以用pthread_detach 函数将线程设置为脱离线程

    相关函数:

    /* 取得 detachstate */
    int pthread_attr_getdetachstate( const pthread_attr_t *attr, int *detachstate );
    /* 设置 detachstate */
    int pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate );
    
  • stackaddr & stacksize 线程堆栈的起始地址和大小

    一般来说,我们不需要自己管理线程堆栈,因为 Linux 默认为每个线程分配了足够的堆栈空间(一般是8M).

    可以使用 ulimit -s 命令来查看或修改这个默认值

    相关函数:

    /* 取得 stackaddr */
    int pthread_attr_getstackaddr( const pthread_attr_t *attr, void **stackaddr );
    /* 设置 stackaddr */
    int pthread_attr_setstackaddr( pthread_attr_t *attr, void *stackaddr );
    /* 取得 stacksize */
    int pthread_attr_getstacksize( const pthread_attr_t *attr, size_t *stacksize );
    /* 设置 stacksize */
    int pthread_attr_setstacksize( pthread_attr_t *attr, size_t stacksize );
    /* 取得 stackaddr 和 stacksize */
    int pthread_attr_getstack( const pthread_attr_t * attr, void **stackaddr, size_t *stacksize );
    /* 设置 stackaddr 和 stacksize */
    int pthread_attr_setstack( pthread_attr_t *attr, void *stackaddr, size_t stacksize );
    
  • guardsize 保护区域大小

    如果 guardsize > 0,则系统创建线程的时候会在其堆栈的尾部额外分配guardsize 字节的空间,用于保护堆栈不被错误地覆盖

    如果 guardsize = 0,则不会设置保护区域

    如果使用者通过 pthread_attr_setstackaddr 函数,或 pthread_attr_setstack 函数来手动设置线程的堆栈,则guardsize 属性会被忽略

    相关函数:

    /* 取得 guardsize */
    int pthread_attr_getguardsize( const pthread_attr_t *attr, size_t *guardsize );
    /* 设置 guardsize */
    int pthread_attr_setguardsize( pthread_attr_t *__attr, size_t guardsize );
    
  • schedparam 线程调度参数

    类型:sched_param结构体

    结构体成员:目前只有 shed_priority,表示线程的运行优先级

    /* 取得 schedparam */
    int pthread_attr_getschedparam( const pthread_attr_t *attr, struct sched_param* param );
    /* 设置 schedparam */
    int pthread_attr_setschedparam( pthread_attr_t *attr, const struct sched_param* param );
    
  • schedpolicy 线程调度策略

    可选值:

    SCHED_FIFO:采用先进先出调度

    SCHED_RR:采用轮转算法(round-robin)调度

    SCHED_OTHER:默认值

    FIFO 和 RR 两种调度方法都具备实时调度功能,但只能用于以超级用户身份运行的进程

    /* 取得 schedpolicy */
    int pthread_attr_getschedpolicy( const pthread_attr_t *attr, int *policy );
    /* 设置 schedpolicy */
    int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy );
    
  • inheritsched 是否继承调用线程的调度属性

    可选值:

    PTHREAD_INHERIT_SCHED:新线程沿用创建者的线程调度参数(这种情况下再这只新线程的调度参数将没有任何效果)

    PTHREAD_EXPLICIT_SCHED:表示调用者要明确指定新线程的调度参数

    /* 取得 inheritsched */
    int pthread_attr_getinheritsched( const pthread_attr_t *attr, int *inherit );
    /* 取得 inheritsched */
    int pthread_attr_setinheritsched( pthread_attr_t *attr, int inherit );
    
  • scope 线程间竞争 CPU 的范围

    可选值:

    PTHREAD_SCOPE_SYSTEM:表示目标线程与系统中所有线程一起竞争 CPU 的使用

    PTHREAD_SCOPE_PROCESS:目标线程仅与其他隶属于同一进程的线程竞争 CPU 的使用

    虽然 POSIX 标准定义了两个可选值,但目前 linux 只支持 PTHREAD_SCOPE_SYSTEM一种取值

    /* 取得 scope */
    int pthread_attr_getscope( const pthread_attr_t *attr, int *scope );
    /* 设置 scope */
    int pthread_attr_setscope( pthread_attr_t *attr, int scope );
    

相关文章

网友评论

      本文标题:C++ Linux多线程:各种线程属性和对它们做相关操作的函数

      本文链接:https://www.haomeiwen.com/subject/mancvktx.html