linux-线程
- 线程的概念
1>linux的线程与windos的线程区别很大(win的线程比较完善,进程不行,linux的进程发展的更早)
2>每一个进程都会分配0-4G的虚拟空间地址,而线程共享0-4G的虚拟地址空间,但每一个线程有自己不同的pcb.但pcb中指向内存资源的三级页表是相同的
三级页表(mmu映射虚拟地址到物理内存的过程)
3>线程是最小的执行单位(抢占cpu的最小单位(根据线程的LWP号(使用ps -Lf pid//查看指定的线程LWP号))),进程是最小的资源分配单位(0-4G资源分配).
4>进程可以蜕变成线程
5>线程可看做是寄存器和栈的集合
- 线程之间共享的资源和非共享的资源
1>线程共享的资源
a:文件描述符表
b:每种信号的处理方式(所以线程不建议使用信号,共享处理,互相干扰)
c:当前工作目录(因为创建线程需要进程,进程不变,多个线程自然共享工作目录)
d:用户ID和用户组ID
e:内存地址空间(.text/.data/.bss/heap/共享库)(除开了栈空间:因为栈空间存储的每个线程的函数h和变量)
2>线程独享的资源
a:线程ID
b:处理器现场和栈指针(内核栈)
c:独立的栈空间(用户空间栈)
d:errno变量
e:信号屏蔽字(系统阻塞信号集)
f:调度优先级
- 线程与进程的对比
优点:1>程序的并发性更高(抢占cpu的执行时间更强);2>开销小(与进程相差不是特别大);3>数据通信,共享数据方便;(因为工共享用户区(出去栈空间))
缺点(都不是很突出的问题):1>线程多使用库函数,相比系统函数不稳定;2>不支持gdb调试;3>对信号支持不友好;
- 线程控制函数
1>pthread_self()函数:相当于getpid();获取当前线程的ID号(用于进程间识别不同的线程).(注意:不应使用pthread_create()函数的传出参数获取线程的ID号,而应使用该函数)
2>pthread_create()函数(相当于fork()函数)
注意:linux环境下,所有线程特点,失败若有返回值,直接返回的是编号;(区别进程)
3>pthread_exit()函数(注意:exit();pthread_exit();return ;三者在线程编程中的使用)
a:pthread_exit:结束调用该函数的线程;
b:return:返回到调用函数的地方(上一级)
c:exit:结束进程,所有的线程也会结束(线程编程慎重使用)
4>pthread_join()函数(相当于wait()函数(阻塞等待回收))
注意:进程是父进程给子进程回收,但是线程可以不,子线程也可以调用该函数进行回收指定的线程.
5>pthread_detach()函数(线程独有的)
将线程分离,分离后的线程结束后自动清理pcb控制部分的资源回收;常用于服务器里.分离后的线程就不需要pthread_join()函数回收(回收分离线程会报错);
6>pthread_cancel()函数
注意:杀死(取消)线程,相当于进程的kill()函数,但是pthread_cancel()函数不是实时的,必须到达取消点(比如系统调用:pause,wait,等函数,man 7 pthreads查看取消点)才会取消.
#include<stdio.h>
#include <pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include <string.h>
/*******************************************************
*函数:pthread_self()
*头文件: #include <pthread.h>
*格式: pthread_t pthread_self(void); //pthread_t:typedef unsigned long