线程的相关的属性

这篇博客主要介绍了线程相关的一些属性

线程有关的属性

POSIX.1中规定的线程属性有4个:detachstate、guardsize、stackaddr、stacksize

  1. detachstate
    线程detach状态指的是:当我们不需要知道线程退出时的终止状态,可以设置线程为detach
    状态,这样当线程退出时,它的资源会自动被系统回收。

在pthread中,以设置deatchstate为例,一般的过程大致如下:

#include <pthread.h>

int
makethread(void *(*fn)(void *), void *arg)
{
    int err;
    pthread tid;
    pthread_attr_t attr;

    //init attribute structure
    err = pthread_attr_init(&attr);
    if (err != 0)
        return err;

    //set detachstate attribute
    err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    if (err == 0)
        err = pthread_create(&tid, &attr, fn, arg);
    //destroy attribute structure
    pthread_attr_destroy(&attr);
    return err;
}

如代码所示,首先需要调用pthread_attr_init初始化线程属性,然后调用专门设置
detachstate的方法pthread_attr_setdetachstate设置属性值,最后需要调用
pthread_attr_destroy释放线程属性。
pthread中设置属性大致都是这样的步骤,比较麻烦,但这是为了代码可移植性,各个操作
系统在保持函数签名一直下,各自实现自己的线程属性。

  1. stackaddr和stacksize
    这几个变量都是控制线程栈大小的变量,因为实际中存在我们希望栈尽可能小一点和栈尽可
    能大一些的情况。
  • 希望栈小一些:因为一个进程内的所有线程公用一个地址空间,所以减少栈空间后才能容
    纳更多的线程
  • 希望栈大一些:栈上存储的时函数调用信息和函数内的自动变量,当函数调用层级很多时
    ,需要的函数调用信息会增大,就需要栈空间大。
    我们就可以通过stacaddr和stacksize来设置栈大小
  1. guardsize
    这个属性控制栈的末尾预留的安全空间的大小,安全空间能够防止栈溢出

mutex的属性

  1. process-shared
    用途是控制mutex变量是否是多个线程共享的
  2. robust
    当mutext被多个进程共享时,可能发生的情况是一个持有mutex的进程因为某种原因终止了
    而且该进程终止前未释放mutex。这样可能导致其他进程等待获取mutex的进程处于永远等待
    状态。
    robust属性是应对这种情况的,当robust属性值设置为PTHREAD_MUTEX_ROBUST时,其他进
    程可以获取mutex,不需要处于永远等待的情况。
  3. type
    mutex的类型,有如下类型:
  • PTHREAD_MUTEX_NORMAL: 标准的锁类型,不检查任何错误或者死锁
  • PTHREAD_MUTEX_ERRORCHECK: 会检查错误
  • PTHREAD_MUTEX_RECURSIVE: 允许同一个线程多次获取锁,而不会报错
  • PTHREAD_MUTEX_DEFAULT: 规定mutex创建时,默认mutex的类型,这个默认类型是上述
    三种类型中的一种

其他类型锁的属性如下

名称 属性
read-writer锁 process-shared
Condition变量 process-shared,clock
Barrier process-shared

condition变量用在等待某一条件发生,发生后唤醒当前线程,有的情况,可以传一个参数
设置最大等待时间,clock属性就是设置这个等待时间所用的时钟

可重入性(Reentrancy)

如果一个函数可以安全地被多个线程同时调用,那么这个函数就是线程安全或者可重入的

线程私有数据

同一个线程下的多个线程间资源都是共享的,不过某些场景下我们希望线程拥有私有的数据
这个也是支持的

cancel选项

一个线程可以调用pthread_cancel函数向另外一个线程发出终止运行请求,与此相关的属
性有state和type
state:可以控制是否接受其他线程的终止请求
type:可以控制响应终止请求的时机:马上响应或者特定的函数调用处

线程和信号

信号发送至线程的,因此线程的信号也是公共资源,一般只有一个线程会响应信号

线程和fork

fork函数会创建一个子进程,子进程完全复制父进程。当在一个线程中调用fork时,这些依
然成立,但子进程只会有保留一个线程,就是调用fork的那个线程
但如果父进程中的其他线程持有锁,在子进程中,这个锁仍然是被持有的状态。

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