多线程总结_1

多线程
1.线程概念 2.线程概念 3.线程安全 4.线程池

线程概念
1.为啥会有线程
当cpu技术发展到一个瓶颈的时候,我们的程序运行效率也随之来到了瓶颈,由于我们程序是顺序执行的(串行执行),每次只能处理一个请求,由业务的发展,并发量的上升,同一时刻会有很多个请求需要处理,我们的程序是串行执行,那么效率就会很低下,对于业务处理而言就是不能忍受的,
2.啥是个线程
线程在Linux操作系统当中就是一个执行流,在内核当中创建一个PCB,其实就是创建一个task_struct结构体对象,这个PCB当中的内存指针,指向进程的虚拟地址空间,
不同的执行流可以拥有不同的cpu来进行运算,换一句话说,不同的程序流之间可能会有并行的情况产生,这回我们讲并发的这种场景下,不同的执行流访问的资源可能会导致程序异常的情况称之为线程安全
当进程当中只有一个执行流的时候,意味着之后一个主线程的时候,在这种情况 pid == tgid
pid:线程id
tgid:线程组id
主线程的pid也是等于tgid的
pid==tgid
工作线程(新创建出来的线程)
tgid:相当于进程号,线程组id
pid;相当于线程id,每一个线程pid都是

问题:创建线程的过程和调用vfork创建子进程有什么区别?

创建线程的接口是调用的库函数,引申含义,也就是说,操作系统内核当中压根没有线程的概念,内核认为我们创建的线程,是在内核当中创建了一个轻量级进程(LWP)

创建出来的线程的PCB,也是需要挂在内核当中的双向链表当中去的,也就是意味着操作系统在管理线程(轻量级进程LWP)的时候,也是通过双线链表来获取到线程的PCB的,从而调度该线程(PCB)获取到CPU资源,这也是同一个程序当中不同的执行流(线程),可以并行运行的原因之一:
线程是操作系统调度的最小单位
进程是操作系统分配资源的最小单位

线程的优点
创建一个新的线程要比创建一个新的进程的开销小,意味着操作系统付出的资源代价小
线程的切换要比进程切换成本小
线程占用的资源要比进程占用的资源少
多线程可以并发执行,提高效率

线程的缺点
健壮性和鲁棒性相较于单线程的程序而言比较低
缺乏访问控制
编程难度高
性能的损失

线程数量越来越多好吗?
不是的,由于大量的线程都需要占有CPU,这会儿操作系统的调度的开销就会特别的大,操作系统就会忙于去调度线程

线程的独有和共享

共享
共享了虚拟地址空间,代码段数据段
文件描述符
当前进程的工作路径
用户id和组id

独有
tid
栈(这个栈就是解决vfork所带来的调用栈混乱的问题)
信号屏蔽字
调度优先级
一组寄存器:为了线程调度所产生的
errno

多线程和多进程的区别
多进程:
由于每一个进程都是拥有自己独立的虚拟地址空间,所以一个进程的异常不会导致其他进程的退出
多进程也可以提高执行效率
多线程:

线程控制
线程创建/线程终止/线程等待/线程的分离

前提:线程控制的接口都是调用的库函数,在使用线程控制的函数的时候

线程创建
int pthread_create(pthread_t* thread, const pthread_sttr_t attr,void(star_routine)(void),void *arg);
thread:出参,返回的时候线程的标识符,和线程id不是一回事,pthread_t,是一个地址,线程空间的首地址,通过这个标识符可以对当前的线程进行操作
attr:类型是pthread_attr_t是一个结构体,这个结构体完成对新创建线程属性的设置,如果说在创建线程的时候,该参数被设置成NULL了,则表示采用默认的属性
线程栈的大小
线程栈的起始位置
线程的分离属性
线程的优先级调度属性
start_routine
1.可以传递默认类型,也可以传递自定义类型(结构体,类的实例化指针)
2.传递参数的时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值