一。线程概念
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设置线程栈空间大小和起始地址
