linux多线程

来源:互联网 发布:ext js anchor 编辑:程序博客网 时间:2024/05/16 13:00

多线程比多进程“节俭”,同一进程的线程之间共享数据段、代码段、堆栈段。运行于一个进程中的多个线程,使用相同的地址空间,线程之间的切换时间远小于进程之间的切换。

多线程更利于数据的共享。

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)
rtn:清除函数,arg为清除函数参数。将清除函数压入清除栈中。
#include<pthread.h>void pthread_cleanup_pop(int execute)
将清除函数弹出清除栈。
执行到pthread_cleanup_pop时,由execute确定是否执行清除函数,若execute为非零,则执行,若为0,则不执行清除函数。return时始终不执行清除函数。








原创粉丝点击