一。线程概念
1.线程基本概念
2.线程之间共享、非共享
3.线程优缺点
二。线程控制原语
1.pthread_self函数
‘
2.pthread_create函数
3.pthread_exit函数
4.pthread_join函数
5.循环创建多线程
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<sys/types.h> #include<string.h> void *thread_func(void *arg) { int i=(int)arg; sleep(i); printf("I am %d thread,thread id =%lu,pid=%u ",i+1,pthread_self(),getpid());
} int main() { pthread_t thid; int i; int ret; for(i=0;i<5;i++) { ret=pthread_create(&thid,NULL,thread_func,(void *)i); if(ret!=0) { char * str=strerror(ret); fprintf(stderr,"pthread_create error:%s",str); return 0; } } sleep(i); pthread_exit(NULL); //退出当前(主控)线程,不影响子线程
// return 0;//退出主控线程,影响子线程
// exit(1);//退出进程,在任何子线程都会退出进程
}
6.回收多个子线程
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<sys/types.h> #include<string.h> int var; void *thread_func(void *arg) { int i=(int)arg; sleep(i); if(i==0) { printf("I am %d thread,thread id =%lu,pid=%u ",i+1,pthread_self(),getpid()); var=100; pthread_exit((void*)var); //第一个线程返回100 }else { var=300; printf("I am %d thread,thread id =%lu,pid=%u ",i+1,pthread_self(),getpid()); } pthread_exit((void*)var); //其余线程返回300 } int main() { pthread_t thid[5]; int i; int ret; int *retvar[5]; for(i=0;i<5;i++) { ret=pthread_create((thid+i),NULL,thread_func,(void *)i); if(ret!=0) { char * str=strerror(ret); fprintf(stderr,"pthread_create error:%s",str); return 0; } } for(i=0;i<5;i++) { pthread_join(thid[i],(void**)&retvar[i]); //var返回给retvar[i]; printf("第%d个进程已回收,retvar=%d ",i+1,(int)retvar[i]); } pthread_exit(NULL); return 0; }
7.pthread_detach函数
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<sys/types.h> #include<string.h> void *thread_func(void *arg) { int var=100; pthread_exit((void*)var); } int main() { pthread_t thid; void *retvar; int ret; pthread_create(&thid,NULL,thread_func,NULL); pthread_detach(thid); //分离线程 ret=pthread_join(thid,&retvar); //回收失败 pthread_join err:Invalid argument if(ret!=0) { fprintf(stderr,"pthread_join err:%s ",strerror(ret)); return 0; } printf("%d",(int)retvar); }
8.pthread_cancel
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<sys/types.h> #include<string.h> void *thread_func(void *arg) { while(1) { pthread_testcancel(); //设置取消点 } pthread_exit((void*)100); } int main() { pthread_t thid; void *retvar; int ret; pthread_create(&thid,NULL,thread_func,NULL); pthread_cancel(thid); //杀死进程,线程中必须有系统调用 或者 手动设置取消点 ret=pthread_join(thid,&retvar); if(ret!=0) { fprintf(stderr,"pthread_join err:%s ",strerror(ret)); return 0; } printf("%d ",(int)retvar); //被杀死的进程retvar=-1 }
9.进程与线程函数对比
fork pthread_create;
exit pthread_exit
wait pthread_join
getpid pthread_self
三。线程属性
1.线程属性基本函数
2.设置分离状态
detachstate取值
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<sys/types.h> #include<string.h> void *thread_func(void *arg) {
pthread_cond_timedwait(); //给create有时间返回 int var=100; pthread_exit((void*)var); } int main() {
pthread_attr_t attr; //定义属性attr pthread_attr_init(&attr); //初始化attr pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); //将attr设置为分离态
pthread_t thid; void *retvar; int ret; pthread_create(&thid,&attr,thread_func,NULL); //创建时加入attr // pthread_detach(thid); ret=pthread_join(thid,&retvar); if(ret!=0) { fprintf(stderr,"pthread_join err:%s",strerror(ret)); return 0; } printf("%d",(int)retvar); }
3.调整栈空间
3.1查看当前属性的状态
3.2设置线程栈空间大小和起始地址