1.pthread_attr_init(pthread_attr_t attr)和pthread_attr_destroy(pthread_attr_t attr)函数.pthread_attr_setdetachstate(pthread_attr_t attr,int detachstate);pthread_attr_setdetachstate(pthread_attr_t attr, int *detachstate);
头文件:#include<pthread.h> 原型:int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr); pthread_attr_init函数的作用初始化一个线程对象的属性,需要用pthread_attr_destroy函数对其去除初始化. 函数返回值:返回0,表示函数初始化对象成功,失败返回错误代码. 参数说明:指向一个线程属性结构的指针,结构中的元素分别对应着新线程的运行属性。属性对象主要包括是否绑定、是否分离、堆栈地址和大小、优先级等。默认属性为非绑定、非分离、默认1MB堆栈、与父进程有相同优先级。 创建一个脱离线程:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> const char message[]="hello,linux"; int thread_finished=0; void my_err(const char *err_string,int line) { fprintf(stderr,"line:%d",line); exit(1); } void thread_function(void *arg) { pthread_t newthid; newthid=pthread_self(); printf("我是新线程,ID = %u,argument is:%s\n",(unsigned)newthid,(char *)arg); sleep(3); printf("新线程结束!\n"); thread_finished=1; } int main(int argc,char *argv[]) { int ret; pthread_t thid; pthread_attr_t attr; ret=pthread_attr_init(&attr); if(ret!=0) { my_err("init",__LINE__); } ret=pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); if(ret!=0) { my_err("set",__LINE__); } ret=pthread_create(&thid,&attr,(void *)&thread_function,(void *)message); if(ret!=0) { my_err("create",__LINE__); } pthread_attr_destroy(&attr); //销毁线程属性结构,它在重新初始化之前不能重新使用 while(!thread_finished) { printf("主线程等待其它线程结束!\n"); sleep(1); } printf("其它线程结束!\n"); return 0; }
结果:
yang@liu:~/syc/第八章$ ./pthreadgetsetduoli 主线程等待其它线程结束! 我是新线程,ID = 3437819648,argument is:hello,linux 主线程等待其它线程结束! 主线程等待其它线程结束! 新线程结束! 其它线程结束!
2.int pthread_attr_getschedpolicy(pthread_attr_t *attr,int *policy)和int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy); 函数pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分别用来设置和得到线程的调度策略。 3, int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param); int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param); int sched_get_priority_max(int policy); int sched_get_priority_min(int policy);