Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)
對(duì)比
進(jìn)程 線程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 kill pthread_cancel ();必須到取消點(diǎn)(檢查點(diǎn)):系統(tǒng)調(diào)用 man 7 pthreads getpid pthread_self 命名空間pthread_detach:分離,好處:自動(dòng)清理pcb什么類型作為返回值,回收就用哪個(gè)類型的地址
線程屬性
linux 下線程的屬性是可以根據(jù)實(shí)際項(xiàng)目需要,進(jìn)行設(shè)置,之前我們討論的線程都是采用 線程的默認(rèn)屬性,默認(rèn)屬性已經(jīng)可以解決絕大多數(shù)開發(fā)時(shí)遇到的問題。
如我們對(duì)程序的性能提出更高的要求那么需 要設(shè)置線程屬性,比如可以通過設(shè)置線程棧的大小來降低內(nèi)存的使用,增加最大線程個(gè)數(shù)。
主要結(jié)構(gòu)體成員:
線程屬性說明
線程屬性控制流程
線程屬性初始化
注意:應(yīng)先初始化線程屬性,再 pthread_create 創(chuàng)建線程
int pthread_attr_init(pthread_attr_t *attr); 成功:0;失敗:錯(cuò)誤號(hào)
int pthread_attr_destroy(pthread_attr_t *attr); 成功:0;失敗:錯(cuò)誤號(hào)
線程的分離狀態(tài)
線程的分離狀態(tài)決定一個(gè)線程以什么樣的方式來終止自己。
線程分離狀態(tài)的函數(shù):
設(shè)置線程屬性,分離 or 非分離 int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);
獲取線程屬性,分離 or 非分離 int pthread_attr_getdetachstate (pthread_attr_t *attr,int *detachstate);
示例1:
#include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<string.h>void *thrd_func(void *arg) {pthread_exit((void *)77); }int main(void) {pthread_t tid;int ret;pthread_attr_t attr;ret = pthread_attr_init(&attr);if(ret != 0){ fprintf(stderr,"pthread_init error: %s\n",strerror(ret));exit(1);} pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);ret = pthread_create(&tid,&attr,thrd_func,NULL); if(ret != 0){ fprintf(stderr,"pthread_create error: %s\n",strerror(ret));exit(1);} ret = pthread_join(tid,NULL);printf("---------join ret = %d\n",ret);pthread_exit((void *)1); }示例2
#include<stdio.h> #include<unistd.h> #include<string.h> #include<pthread.h>void *tfn(void *arg) {int n=3;while(n--){printf("thread count %d\n",n);sleep(1);}return (void *)1; }int main(void) {pthread_t tid;void *tret;int err;#if 1pthread_attr_t attr; //通過線程屬性類設(shè)置游離態(tài)pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);pthread_create(&tid,&attr,tfn,NULL);#elsepthread_create(&tid,NULL,tfn,NULL);pthread_detach(tid); //讓線程分離 ----自動(dòng)退出,無系統(tǒng)殘留資源 #endifwhile(1){err = pthread_join(tid,&tret);printf("---------err= %d\n",err);if(err != 0)fprintf(stderr,"thread error: %s\n",strerror(err));elsefprintf(stderr,"thread exit code %d\n",(int)tret);sleep(1);}return 0; }注意事項(xiàng)
眠,并不能解決線程同步的問題。
線程的棧大小
當(dāng)系統(tǒng)中有很多線程時(shí),可能需要減小每個(gè)線程棧的默認(rèn)大小,防止進(jìn)程的地址空間不夠用,當(dāng)線程調(diào)用的函 數(shù)會(huì)分配很大的局部變量或者函數(shù)調(diào)用層次很深時(shí),可能需要增大線程棧的默認(rèn)大小。
函數(shù) pthread_attr_getstacksize 和 pthread_attr_setstacksize 提供設(shè)置。
默認(rèn)線程棧均分8M空間
查看一個(gè)進(jìn)程最多能創(chuàng)建多少個(gè)線程
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<pthread.h>void *tfn(void *arg) {while(1)sleep(1); }int main(void) {pthread_t tid;int ret,count = 1;for(;;){ret = pthread_create(&tid,NULL,tfn,NULL);if(ret != 0){ printf("%s\n",strerror(ret)); break;} printf("-----------%d\n",++count);} return 0; }
我的是能創(chuàng)建4094個(gè)線程
線程屬性控制示例
#include<stdio.h> #include<unistd.h> #include<pthread.h> #include<string.h> #include<stdlib.h>#define SIZE 0x100000void *th_fun(void * arg) {while(1);sleep(1); }int main(void) {pthread_t tid;int err, detachstate,i=1;pthread_attr_t attr;size_t stacksize;void *stackaddr;pthread_attr_init(&attr);pthread_attr_getstack(&attr,&stackaddr,&stacksize);pthread_attr_getdetachstate(&attr,&detachstate);if(detachstate == PTHREAD_CREATE_DETACHED)//默認(rèn)是分離態(tài)printf("thread detached\n");else if(detachstate == PTHREAD_CREATE_JOINABLE)//默認(rèn)非分離printf("thread join\n");elseprintf("thread un known\n");//設(shè)置線程分離pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);while(1){//在堆上申請(qǐng)內(nèi)存,指定線程棧的起始地址和大小stackaddr = malloc(SIZE);if(stackaddr == NULL){perror("malloc");exit(1);}stacksize = SIZE;pthread_attr_setstack(&attr,stackaddr,stacksize);//借助線程的屬性,修 改線程棧空間大小err = pthread_create(&tid,&attr,th_fun,NULL);if(err != 0){printf("%s\n",strerror(err));exit(1);}printf("%d\n",i++);//i表示循環(huán)創(chuàng)建多少次}pthread_attr_destroy(&attr);return 0; }NPTL(線程庫)
線程使用注意事項(xiàng)
pthread_join
pthread_detach
pthread_create 指定分離屬性
被 join 線程可能在 join 函數(shù)返回前就釋放完自己的所有內(nèi)存資源,所以不應(yīng)當(dāng)返回被回收線程棧中的值;
總結(jié)
以上是生活随笔為你收集整理的Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DNF85版修罗用御龙决刷图不出冰属性加
- 下一篇: 精子畸形是不孕症吗