成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux系統編程—線程屬性

系統 Linux
在之前的章節中,我們在調用pthread_create函數創建線程時,第二個參數(即線程屬性)都是設為NULL,即使用默認屬性。一般情況下,使用默認屬性已經可以解決我們開發過程中的大多數問題。

在之前的章節中,我們在調用pthread_create函數創建線程時,第二個參數(即線程屬性)都是設為NULL,即使用默認屬性。一般情況下,使用默認屬性已經可以解決我們開發過程中的大多數問題。

[[344851]]

但是,有時項目中我們對線程會有些特殊的要求,比如修改線程棧的大小,直接調用線程的庫函數無法滿足需求,在這種情況下我們可以直接對線程屬性進行設置。

類型pthread_attr_t是一個結構體,主要包括如下屬性:作用域(scope)、棧尺寸(stack size)、棧地址(stack address)、優先級(priority)、分離的狀態(detached state)、調度策略和參數(scheduling policy and parameters)。

線程默認的屬性為非綁定、非分離、缺省的堆棧、與父進程同樣級別的優先級。結構體具體定義如下:

主要結構體成員:

  • ​線程分離狀態:etachstate
  • ​線程棧大小(默認平均分配):stacksize
  • ​線程棧警戒緩沖區大小(位于棧末尾):guardsize

線程的屬性值不能直接設置,須使用相關函數進行操作。屬性的初始化的函數為pthread_attr_init,這個函數必須在pthread_create函數之前調用。使用完畢之后需調用pthread_attr_destroy函數來釋放資源。

##線程屬性初始化

函數原型:

  1. int pthread_attr_init(pthread_attr_t *attr); 

返回值:

成功:0;失敗:錯誤號。

函數作用:初始化線程屬性;

注意:應先初始化線程屬性,再調用pthread_create創建線程。

##線程屬性銷毀

函數原型:

  1. int pthread_attr_destroy(pthread_attr_t *attr); 

返回值:

成功:0;失敗:錯誤號

函數作用:銷毀線程屬性所占用的資源

##線程的分離狀態

線程的分離狀態決定一個線程最后終止的時候是以怎樣的方式回收資源。

非分離狀態:線程的默認屬性是非分離狀態,這種情況下,線程運行結束后,只有當其它線程調用pthread_join()函數去回收它時,創建的線程才算終止,才能釋放自己占用的系統資源。

分離狀態:線程如果設置為分離狀態,則它將主動與主控線程脫離關系,當它自己運行結束了,線程也就終止了,馬上釋放系統資源。

設置線程分離狀態的函數:

設置線程屬性

  1. int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); 

獲取程屬性

  1. int pthread_attr_getdetachstate(pthread_attr_t attr, int detachstate); 

參數:attr:指向一個線程屬性的指針

detachstate:線程分離狀態

  • PTHREAD_CREATE_DETACHED(分離線程)
  • PTHREAD _CREATE_JOINABLE(非分離線程)

##線程的棧地址

POSIX.1定義了兩個常量_POSIX_THREAD_ATTR_STACKADDR 和_POSIX_THREAD_ATTR_STACKSIZE檢測系統是否支持棧屬性。也可以給sysconf函數傳遞_SC_THREAD_ATTR_STACKADDR或 _SC_THREAD_ATTR_STACKSIZE來進行檢測。

當進程棧地址空間不夠用時,指定新建線程使用由malloc分配的空間作為自己的棧空間。通過pthread_attr_setstack和pthread_attr_getstack兩個函數分別設置和獲取線程的棧地址。

設置線程的棧地址:

  1. int pthread_attr_setstack(pthread_attr_t attr, void stackaddr, size_t stacksize); 

成功:0;失敗:錯誤號

獲取線程的棧地址:

  1. int pthread_attr_getstack(pthread_attr_t attr, void **stackaddr, size_t stacksize); 

成功:0;失敗:錯誤號

參數:attr:指向一個線程屬性的指針

  • stackaddr:返回獲取的棧地址
  • stacksize:返回獲取的棧大小

##線程的棧大小

當系統中有很多線程時,可能需要減小每個線程棧的默認大小,防止進程的地址空間不夠用。當線程調用的函數會分配很大的局部變量或者函數調用層次很深時,可能需要增大線程棧的默認大小。

函數pthread_attr_getstacksize和 pthread_attr_setstacksize可以設置或者獲取線程的棧大小。

設置線程棧大小:

  1. int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); 
  • 成功:0;
  • 失敗:錯誤號

獲取線程棧大小:

  1. int pthread_attr_getstacksize(pthread_attr_t attr, size_t stacksize); 
  • 成功:0;
  • 失敗:錯誤號

參數:attr:指向一個線程屬性的指針

stacksize:返回線程的堆棧大小

  1. #include <stdio.h> 
  2. #include <pthread.h>#include <string.h> 
  3. #include <stdlib.h>#include <unistd.h>#define SIZE 0x10000 
  4. void *th_fun(void *arg) 
  5. {    while (1)  
  6.         sleep(1); 
  7. }int main(void){    pthread_t tid;    int err, detachstate, i = 1
  8.     pthread_attr_t attr;    size_t stacksize;   //typedef  size_t  unsigned int     void *stackaddr;    pthread_attr_init(&attr);           pthread_attr_getstack(&attr, &stackaddr, &stacksize);    pthread_attr_getdetachstate(&attr, &detachstate);    if (detachstate == PTHREAD_CREATE_DETACHED)   //默認是分離態 
  9.         printf("thread detached\n"); 
  10.     else if (detachstate == PTHREAD_CREATE_JOINABLE) //默認時非分離 
  11.         printf("thread join\n"); 
  12.     else 
  13.         printf("thread un known\n"); 
  14.     /* 設置線程分離屬性 */    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);    while (1) { 
  15.         /* 在堆上申請內存,指定線程棧的起始地址和大小 */        stackaddr = malloc(SIZE);        if (stackaddr == NULL) { 
  16.             perror("malloc"); 
  17.             exit(1); 
  18.         }        stacksize = SIZE;        pthread_attr_setstack(&attr, stackaddr, stacksize);   //借助線程的屬性,修改線程棧空間大小        err = pthread_create(&tid, &attr, th_fun, NULL);        if (err != 0) { 
  19.             printf("%s\n", strerror(err)); 
  20.             exit(1); 
  21.         }        printf("%d\n", i++); 
  22.     }    pthread_attr_destroy(&attr);    return 0; 

本文授權轉載自公眾號「良許Linux」。良許,世界500強外企Linux開發工程師,公眾號里分享大量Linux干貨,歡迎關注!

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2020-10-10 07:18:14

Linux系統編程管道

2020-10-18 07:13:44

Linux系統編程信號捕捉

2020-09-26 21:43:59

Linux系統編程條件變量

2020-09-22 07:35:06

Linux線程進程

2020-09-28 06:49:50

Linux系統編程互斥量mutex

2020-09-26 23:09:00

Linux系統編程讀寫鎖

2020-09-25 07:34:40

Linux系統編程信號量

2020-10-05 22:05:10

Linux系統編程時序競態

2020-10-08 10:10:51

Linux系統編程信號集

2020-10-09 07:13:11

Linux系統編程mmap

2017-02-28 18:26:09

Linuxinput子系統編程

2010-03-05 13:34:54

2019-03-15 09:30:09

Linux系統CPU

2009-07-03 11:57:18

系統編程安全linux

2009-10-23 16:35:44

linux Debia

2010-02-02 13:26:53

Linux內核

2025-04-16 04:22:00

2024-10-06 14:37:52

2021-05-16 18:02:52

系統編程JavaScript

2013-07-23 10:24:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91干b| 国产欧美日韩在线 | 日日精品| 欧美国产日韩一区二区三区 | 久久久精彩视频 | 成人免费一区二区三区视频网站 | 伊人一区| 欧美啊v在线观看 | 91九色porny首页最多播放 | 日本aa毛片a级毛片免费观看 | 久久9999久久 | 欧洲一区视频 | 91精品中文字幕一区二区三区 | 亚洲91av| 日本成人中文字幕 | 久久99视频免费观看 | 四色永久 | 亚洲社区在线 | 日韩三级在线 | 黄色片网站在线观看 | 久久一区精品 | 第一色在线 | 欧美一区中文字幕 | 亚洲国产情侣自拍 | 欧美中文在线 | 久久不射电影网 | 国产欧美在线视频 | 中国一级特黄毛片大片 | 粉嫩粉嫩芽的虎白女18在线视频 | 国产成人精品免费视频大全最热 | 久久亚洲综合 | 精品乱码久久久久 | 成人不卡在线 | 成人亚洲网 | 成人中文网 | аⅴ资源新版在线天堂 | 亚洲综合中文字幕在线观看 | 国产精品欧美一区喷水 | 久久久亚洲一区 | 久久亚洲精品久久国产一区二区 | 成人精品一区 |