线程
pthread_create() pthread_exit()
创建了线程之后,地址空间不变化,但是内核态增加了一个pcb,原进程变为主进程,创建出的为子进程。两线程共享地址空间,有各自独立的pcb,子线程的pcb是拷贝的主线程的
用户区:
- .text //代码段
- .bss //未初始化的全局变量
- .data //初始化的全局变量
- 堆
- 栈
- 动态库加载区
- 环境变量
- 命令行参数
用户区只有栈是不共享的,栈是平均分配
通信:
- 全局变量,堆
Linux中:
线程就是轻量级的进程
对于内核来说,线程就是进程
相关概念:
线程号:线程号给内核看,查看方式ps -Lf pid
,pid为进程号
线程ID:不同于线程号
一个单独的进程可以看成一个线程
多线程和多进程的区别:
- 多进程(父子):
– 共享的资源:代码,文件描述符,内存映射区 - 多线程:
– 共享的资源:堆,全局变量
– 节省资源
主线程退出,子线程立即结束
函数原型:
int pthread_create(
pthread_t *thread,//线程ID,无符号长整形,传出的参数
const pthread_attr_t *attr,//线程属性,NULL,分离,设置分离可以自己释放自己的pcb
void *(*start_routine)(void *),//线程处理函数
void *arg//线程处理函数参数
);
函数描述:创建线程
线程属性:
*
返回值:成功返回0,错误返回错误号,不能使用perror打印错误
函数原型:void pthread_exit(void *retval);
函数功能:单个线程退出(可以退出主线程)
函数参数:传出退出信息,必须指向全局
返回值:空
– 使用exit()会使得两个线程同时退出,return也行
函数原型:int pthread_join(pthread_t thread, void **retval);
函数功能:阻塞等待子线程的退出,获取线程退出状态
函数参数:要回收的线程ID 读取线程退出状态(传一级指针的地址)
指向的地址和pthread_exit()参数指向的地址是一样的
函数原型:int pthread_detach(pthread_t thread);
函数功能:线程分离–子线程可以自己回收pcb(也可以在创建的时候指定)
函数原型:int pthread_cancel(pthread_t thread)
函数功能:杀死(取消)线程,必须做过一次系统调用(调用系统函数)
pthread_testcancel:设置取消点
函数原型
int pthread_equal(pthread_t t1, pthread_t t2);//预留函数,基本不用
通过属性设置线程分离:
1.线程属性类型:pthread_attr_t attr;
2.线程属性操作函数:
- 对线程属性变量的初始化
- int pthread_attr_init(pthread_attr_t* attr);
- 设置线程分离属性
- int pthread_attr_setdetachstate(
pthread_attr_t *attr,
int detachstate
); - 参数:
- attr:线程属性
- detachstate:
- PTHREAD_CRAETE_DETACHED(分离)
- PTHREAD_CREATE_JOINABLE(非分离)
- int pthread_attr_setdetachstate(
- 释放线程资源函数
- int pthread_attr_destroy(pthread_attr_t *attr);