线程理论基础:和进程相比,它是一种非常节俭的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段,堆栈段和数据段,这是一种昂贵的多任务工作方式。运行于一个进程中的多个线程,他们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。一个进程的开销大约是一个线程开销的30倍左右。由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷而且方便。多线程程序作为一种多任务,并发的工作方式,使用CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同线程运行于不同的CPU上。linux系统下的多线程遵循POSIX线程接口,称为pthread,编写Linux下的多线程程序,需要使用头文件pthread.h连接需要使用库libpthread.a.
多线程程序设计:
创建一个线程: int pthread_create(pthread_t* tidp,const pthread_attr_t* attr,void*(*start_rtn)(void),void* arg) tidp:线程id attr:线程属性(通常为空) start_rtn:线程要执行的函数 argstart_rtn的参数
因为pthread的库不是linux系统的库,所以再进行编译的时候要加上-lpthread #gcc filename -lpthread
终止线程:如果进程中任何一个线程中调用exit或_exit,那么整个线程都会终止,线程的正常退出方式有:线程从启动例程中返回 (return返回) 线程可以被另一个进程终止 线程自己调用pthread_exit函数
void pthread_exit(void* rval_ptr) 终止调用线程 Rval_ptr线程退出返回值的指针
线程等待:int pthread_join(pthread_t tid,void **rval_ptr)功能是阻塞调用线程,直到指定的线程终止 tid等待退出的线程id rval_ptr:线程退出的返回值的指针 正常终止和非正常的终止。线程主动调用pthread_exit或者从线程函数中return都将线程正常退出。非正常终止是线程在其它线程的干预下,或者由于自身运行出错比如访问非法地址而退出,这种退出方式是不可预见的。
进程退出会导致该进程下的所有线程退出。
进程的标识:获取调用线程的thread identidier pthread_t pthread_self(void)