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

线程属性

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 );
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355