多线程比多进程“节俭”,同一进程的线程之间共享数据段、代码段、堆栈段。运行于一个进程中的多个线程,使用相同的地址空间,线程之间的切换时间远小于进程之间的切换。
多线程更利于数据的共享。
linux系统下的多线程遵循POSIX线程接口,称为pthread。编写linux下的多线程程序,需要使用头文件pthread.h,还需要连接libpthread.a程序库:
gcc filename -lpthread -o filename1
1.线程创建
#include<pthread.h>
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void),void *arg)
tidp:线程id
attr:线程属性,通常为空
start_rtn:线程要执行的函数(linux中线程的本质即为函数)
arg:start_rtn的参数。
2.线程终止
进程中的任何一个线程调用exit或者_exit,整个进程都会终止!线程的正常退出方式:
2.1线程从程序中返回(return)
2.2线程被另一个进程终止
2.3线程调用自己的pthread_exit函数:
#include<pthread.h>
void pthread_exit(void *rval_ptr)
rval_ptr为线程退出时返回的指针。
3.线程等待
#include<pthread.h>
int pthread_join(pthread_t tid,void **rval_ptr)
阻塞进程,调用线程,直到指定的线程终止。
tid:等待推出的线程的id,rval_ptr为线程退出时返回的指针。
4.线程标识
#include<pthread.h>
pthread_t pthread_self(void)
获取线程的id
5.线程清除
线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit或者从线程函数中return都为正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行错误(比如非法地址访问)而退出,这种退出方式不可预见,需要释放资源。
从pthread_cleanup_push的调用点到pthread_cleanup_pop之间的程序段中的终止动作(包括pthread_exit和异常终止,不包括return)都将执行pthread_cleanup_push()所指定的清理函数。
#include<pthread.h>
void pthread_cleanup_push(void (*rtn)(void *),void *arg)
#include<pthread.h>
void pthread_cleanup_pop(int execute)