Linux--线程
1【线程的概述】
进程 是系统分配资源的基本单位
线程 是cpu执行调度的基本单位
线程是轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程,进程必须至少包含一个线程。
线程 依赖于 进程,线程共享进程的资源,进程结束 当前进程的所有线程 都将立即结束。
线程共享资源
1) 文件描述符表
2) 每种信号的处理方式
3) 当前工作目录
4) 用户ID和组ID 内存地址空间 (.text/.data/.bss/heap/共享库)
线程非共享资源
1) 线程id
2) 处理器现场和栈指针(内核栈)
3) 独立的栈空间(用户空间栈)
4) errno变量
5) 信号屏蔽字
6) 调度优先级
线程的优缺点
优点: Ø 提高程序并发性 Ø 开销小 Ø 数据通信、共享数据方便
缺点: Ø 库函数,不稳定 Ø 调试、编写困难、gdb不支持 Ø 对信号支持不好 优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。
2【线程的API】
1、查看线程号
#include<pthread.h>
pthread_t pthread_self(void);
功能:
获取线程号。
参数:
无
返回值:
调用线程的线程 ID
2、创建线程
#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
3、回收线程资源(阻塞)
#include<pthread.h>
int pthread_join(pthread_t thread, void **retval);
功能:
等待线程结束(此函数会阻塞),并回收线程资源,类似进程的 wait() 函数。如果线程已经结束,
那么 该函数会立即返回。
参数:
thread:被等待的线程号。
retval:用来存储线程退出状态的指针的地址
返回值:
成功:0
失败:非 0
4、pthread_detach分离线程(不阻塞)
#include<pthread.h>
int pthread_detach(pthread_t thread);
功能:
使调用线程与当前进程分离,分离后不代表此线程不依赖与当前进程,线程分离的目的是将线
程资源的回收工作交由系统自动来完成,也就是说当被分离的线程结束之后,系统会自动回收
它的资源。所以,此函数不会阻塞。
参数:
thread:线程号。
返回值:
成功:0
失败:非0
5、pthread_exit线程退出
#include<pthread.h>
void pthread_exit(void *retval);
功能:
退出调用线程。一个进程中的多个线程是共享该进程的数据段,因此,通常线程退出后所占用
的资源并不会释放。
参数:
retval:存储线程退出状态的指针。
返回值:无
6、pthread_cancel线程的取消
#include<pthread.h>
int pthread_cancel(pthread_t thread);
功能:
杀死(取消)线程
参数:
thread : 目标线程ID。
返回值:
成功:0
失败:出错编号
知识点5【线程的属性】
typedef struct
{
int etachstate; //线程的分离状态
int schedpolicy; //线程调度策略
struct sched_param schedparam; //线程的调度参数
int inheritsched; //线程的继承性
int scope; //线程的作用域
size_t guardsize; //线程栈末尾的警戒缓冲区大小
int stackaddr_set; //线程的栈设置
void* stackaddr; //线程栈的位置
size_t stacksize; //线程栈的大小
}pthread_attr_t;
初始化线程属性函数:
int pthread_attr_init(pthread_attr_t *attr);
函数返回值:成功:0;失败:错误号
销毁线程属性所占用的资源函数:
int pthread_attr_destroy(pthread_attr_t*attr);
函数返回值:成功:0;失败:错误号
线程分离状态的函数:
设置线程属性,分离or非分离
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
获取程属性,分离or非分离
int pthread_attr_getdetachstate(pthread_attr_t *attr, int* detachstat);
参数:
attr:已初始化的线程属性
detachstate:分离状态
PTHREAD_CREATE_DETACHED(分离线程)
PTHREAD_CREATE_JOINABLE(非分离线程)