线程:
LWP: light weight process
轻量级的进程,本质仍是进程
(
在
Linux
环境下
)
进程与线程的区别
进程
:
有独立
PCB
,且有独立地址空间,
线程
:
有独立
PCB
,但没有独立的地址空间
(
共享
)
。
区别
:
在于是否共享地址空间。
线程
:
最小的执行单位。
进程
:
最小分配资源单位(可看成是只有一个线程的进程)
linux下内核实现线程原理
1.
轻量级进程
(ight-weight process),
也有
PCB
,创建线程使用的底层函数和进程一样, 都是
clone
2.
从内核里看进程和线程是一样的, 都有各自不同的
PCB
,但是线程
PCB
中指向内存资源的三级页表是
相同的。
3.
进程可以蜕变成线程。
4.
线程可看做寄存器和栈的集合。
5.
在
linux
下,线程最是小的执行单位
:
进程是最小的分配资源单位。
线程共享资源
1.
文件描述符表
2.
每种信号的处理方式
3.
当前工作目录
4.
用户
ID
和组
ID
5.
内存地址空间
(.text/.data/.bss/heap/
共享库
)
、共享全局变量
线程非共享资源
1.
线程
id
(线程标识符)
2.
处理器现场和栈指针
(
内核栈
)
3.
独立的栈空间
(
用户空间栈
)
4.errno
变量
5.
信号屏蔽字
6.
调度优先级
线程优、缺点
优点
:
1.
提高程序并发性
2.
开销小
3.
数据通信、共享数据方便。
缺点
:
1.
属于库函数,不稳定
2.
调试、编写困难、
gdb
不支持
3.
对信号支持不好
pthread_t 线程标识符
函数:在使用gcc 生成文件时需要在最后加上——lpthread库函数
pthread_self()获取线程ID,没有入参,ID为无符号整数(%lu)
pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start routine) (void *), void *arg);创建新线程
参数1:传出参数,保存系统为我们分配好的新线程ID。
参数2:线程属性,通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
参数3:回调子线程函数名
参数4:参3子线程函数需要的参数,没的话传NULL