多线程
1.线程基础
有了进程为什么还要引入线程
多线程属于同一个进程
遵循POSIX。使用pthread.h,连接时需要使用libpthread.a库
2.线程
1.创建线程
#include<pthread.h>
int pthread_create(tidp,attr,start_rtn,arg);
tidp:线程id(用于返回的)。attr:线程属性(通常为空)。start_rtn:线程要执行的函数,是一个函数指针,返回一个void *(需要确认???进行查询确认)。arg:start_rtn的参数
与fork区别去执行指定的函数,指定函数执行完成,此线程结束
2.编译
因为pthread的库不是Linux系统的库,所以在进行编译的时候要加上 -lpthread
gcc filename -lpthread
3.实例
如何传递整型参数
thread_int.c
如何传递string型参数
thread_string.c
如何传递struct型参数
thread_struct.c
变量的使用顺序:线程先使用数据段 全局变量在数据段,临时变量在栈
thread_share.c
4.线程的终止
如果进程中任何一个线程中调用exit或_exit那么整个进程都会终止。线程的常用退出方式有:
1.线程从启动例程中返回
2.线程可以被另一个进程终止
3.线程自己调用pthread_exit函数
void pthread_exit(void* rval_ptr)
rval_ptr:线程退出返回的指针
5.线程等待
int pthread_join(pthread_t tid,void **rval_ptr)
功能:阻塞调用线程,直到指定的线程终止。
tid:等待退出的线程id
rval_ptr:线程退出的返回值指针
进程退出他创建的线程就结束了
6.线程标识
pthread_t pthread_self(void)
功能:获取调用线程的thread identifier.返回当前线程的id
在线程中使用getpid()获取的是创建该线程的进程。也说明了线程是受进程管辖的
7.清除
终止有两种情况:正常和非正常
正常:线程调用pthread_exit.线程return返回(可预见)
非正常:在其他线程干预下或由于自身运行错误退出(不可预见)
资源释放:终止同存在资源释放的问题
从pthread_cleanup_push的调用点到pthread_cleanup_pop之间的程序段中的终止动作(包括调用pthread_exit和异常终止,但是不包括return)都将执行pthread_cleanup_push所指定的清理函数
把认为有必要有可能出现错误的代码保护起来,若异常退出,在退出前执行
void pthread_cleanup_push(rtn,arg)
rtn:清除函数
arg:清除函数的参数
发生异常:在异常终止前或pthread_exit调用rtn函数
不发生异常:正常执行
void pthread_cleanup_pop(int execute)
功能:将清除函数弹出清除栈
参数:execute执行到pthread_cleanup_pop()时是否在弹出清理函数的同时执行该函数,非0:执行,0:不执行
执行到pop通过execute来决定清除函数是否执行
1.线程基础
有了进程为什么还要引入线程
多线程属于同一个进程
遵循POSIX。使用pthread.h,连接时需要使用libpthread.a库
2.线程
1.创建线程
#include<pthread.h>
int pthread_create(tidp,attr,start_rtn,arg);
tidp:线程id(用于返回的)。attr:线程属性(通常为空)。start_rtn:线程要执行的函数,是一个函数指针,返回一个void *(需要确认???进行查询确认)。arg:start_rtn的参数
与fork区别去执行指定的函数,指定函数执行完成,此线程结束
2.编译
因为pthread的库不是Linux系统的库,所以在进行编译的时候要加上 -lpthread
gcc filename -lpthread
3.实例
如何传递整型参数
thread_int.c
如何传递string型参数
thread_string.c
如何传递struct型参数
thread_struct.c
变量的使用顺序:线程先使用数据段 全局变量在数据段,临时变量在栈
thread_share.c
4.线程的终止
如果进程中任何一个线程中调用exit或_exit那么整个进程都会终止。线程的常用退出方式有:
1.线程从启动例程中返回
2.线程可以被另一个进程终止
3.线程自己调用pthread_exit函数
void pthread_exit(void* rval_ptr)
rval_ptr:线程退出返回的指针
5.线程等待
int pthread_join(pthread_t tid,void **rval_ptr)
功能:阻塞调用线程,直到指定的线程终止。
tid:等待退出的线程id
rval_ptr:线程退出的返回值指针
进程退出他创建的线程就结束了
6.线程标识
pthread_t pthread_self(void)
功能:获取调用线程的thread identifier.返回当前线程的id
在线程中使用getpid()获取的是创建该线程的进程。也说明了线程是受进程管辖的
7.清除
终止有两种情况:正常和非正常
正常:线程调用pthread_exit.线程return返回(可预见)
非正常:在其他线程干预下或由于自身运行错误退出(不可预见)
资源释放:终止同存在资源释放的问题
从pthread_cleanup_push的调用点到pthread_cleanup_pop之间的程序段中的终止动作(包括调用pthread_exit和异常终止,但是不包括return)都将执行pthread_cleanup_push所指定的清理函数
把认为有必要有可能出现错误的代码保护起来,若异常退出,在退出前执行
void pthread_cleanup_push(rtn,arg)
rtn:清除函数
arg:清除函数的参数
发生异常:在异常终止前或pthread_exit调用rtn函数
不发生异常:正常执行
void pthread_cleanup_pop(int execute)
功能:将清除函数弹出清除栈
参数:execute执行到pthread_cleanup_pop()时是否在弹出清理函数的同时执行该函数,非0:执行,0:不执行
执行到pop通过execute来决定清除函数是否执行