一、线程和进程的区别
线程:进程内的线程共享进程的资源,线程是CPU调度的最小单位,如果线程所在的进程结束,线程也结束
进程:是系统分配资源的最小单位,一个进程可以有多个线程,至少有一个主线程
二、创建线程
编译时需要加上 gcc 03_test.c -lpthread
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:
创建一个线程。
参数:
thread:线程标识符地址。
attr:线程属性结构体地址,通常为NULL。
start_routine:线程函数的入口地址,回调函数。
arg:传给线程函数的参数,回调函数的参数。
返回值:
成功:返回0
失败:返回非0
#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
void* myFun(void* arg);
int main(int argc, char const *argv[])
{
/* code */
pthread_t tid;
//创建线程(不阻塞)
pthread_create(&tid,NULL,myFun,NULL);
return 0;
}
void* myFun(void* arg)
{
printf("%lu线程执行任务1",(unsigned long)pthread_self());
}
三、回收线程资源
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
功能:
等待子线程结束,并回收子线程资源。
参数:
thread:被等待的线程号。
retval:用来存储线程退出状态的指针的地址。
返回值:
成功返回0,失败返回非0。
四、创建多个线程及回收线程资源
#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
void* myFun1(void* arg);
void* myFun2(void* arg);
int main(int argc, char const *argv[])
{
/* code */
pthread_t tid1,tid2;
//创建线程(不阻塞)
pthread_create(&tid1,NULL,myFun1,"任务1");
pthread_create(&tid2,NULL,myFun2,"任务2");
void *ret1,*ret2;
//回收线程资源-阻塞
pthread_join(tid1,&ret1);
pthread_join(tid2,&ret2);
printf("ret1=%s\n",(char*)ret1);
printf("ret2=%s\n",(char*)ret2);
return 0;
}
void* myFun1(void* arg)
{
char* str=(char*)arg;
printf("线程1执行%s\n",str);
return arg;
}
void* myFun2(void* arg)
{
char* str=(char*)arg;
printf("线程2执行%s\n",str);
return arg;
}
五、线程退出的方式
1、pthread_exit()
#include <pthread.h>
void pthread_exit(void *retval);
参数:
retval:线程返回状态
2、pthread_cancel()
#include <pthread.h>
int pthread_cancel(pthread_t thread);
#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
void* myFun1(void* arg);
void* myFun2(void* arg);
int main(int argc, char const *argv[])
{
/* code */
pthread_t tid1,tid2;
//创建线程(不阻塞)
pthread_create(&tid1,NULL,myFun1,"任务1");
pthread_create(&tid2,NULL,myFun2,"任务2");
printf("5秒后取消线程1\n");
sleep(5);
pthread_cancel(tid1);
void *ret1,*ret2;
//回收线程资源-阻塞
//pthread_join(tid1,&ret1);
pthread_join(tid2,&ret2);
printf("ret1=%s\n",(char*)ret1);
printf("ret2=%s\n",(char*)ret2);
return 0;
}
void* myFun1(void* arg)
{
char* str=(char*)arg;
while(1)
{
printf("线程1执行%s\n",str);
sleep(1);
}
return arg;
}
void* myFun2(void* arg)
{
char* str=(char*)arg;
printf("线程2执行%s\n",str);
pthread_exit("over");
}