理解线程库和线程排斥(锁)

理解线程库

线程要有独立属性 a.独立栈结构 b.寄存器中的上下文

在进程地址库内,维护栈的设备只有一套,如何保证线程都有独立栈?

每个新线程的栈由库维护,库会在堆上开辟一段空间。

默认地址空间的栈由主线程使用

如何理解pthread库来管理线程?

库要被使用,就要被页表映射到进程空间地址中的共享区的

当另一个进程创建线程时,由于pthread动态库也称共享库,另一个进程的所有线程由同一个库管理,依次可得,所有的线程都由一个共享库管理的

当另一个线程想要拿到另一个线程的退出信息,只需要知道他的phread_t类似于下标,再通过pthead_join(pthread_t,&ret)得到

thread id与LWP不匹配,pthread_id是什么?

pthread_id是线程属性集合在库中的地址。

线程局部存储是什么?

我们已经知道全部变量是线程共享的

__thread再全局变量前添加,每个执行流一人一份,该值会被拷贝到线程的局部储存内

gettid()得到tid

__thread pid_t lwp=0; __thread string name;(容器没办法拷贝)

站在语言级别理解pthread

#include<thread>封装了Linux的pthread库

自己实现封装?

tips1:类内成员函数的参数由于thsi无法匹配 解决方法:将this传入运行函数,将它改为静态方法

线程中可以自己fork吗?可以进行程序替换吗?

可以fork,可以替换,但是是将整个进程替换,可能影响其他线程,建议创建子进程去进行程序替换

线程互斥

互斥 :任何时刻,互斥保证有且只有一个执行流进入临界区

任何一个时刻,只允许一个线程访问的资源叫做临界资源,将访问临界资源的代码叫做临界区

背景:并发访问同一份资源是很容易出现访问数据不一致的问题

例子:抢票

为什么出现了负数?

出现数据不一致的问题。多执行流并发的访问了资源,可能当一个线程A执行1--时,被CPU剥离下来,寄存器记录上下文,此时另一个线B程进入,由于第一个进程A的ticket并没有返回给内存,B进程认为ticket还是1,没执行--,它直接被CPU剥离下来,记录上下文,然后A线程被CPU运行,恢复A的上下文之后,对1--,对内存返回0,最后B进程被CPU运行,它去访问共享资源时,得到的是0,再对0--,出现了负数问题。

也就是说,可能在执行判断时,放进来了3,4个线程,去执行--,导致出现负数

**原子性:**要么完成,要么未完成,默认执行一条编译语句叫原子性

例:int cnt=10; cnt ++;

if(ticket>0) 也不是原子的,至少两个编译语句,一句从内存中取到CPU,一句做判断

解决方法:加锁

创建全局锁

pthread mutex t mutex= PTHREAD MUTEX INITIALIZER

锁有了并且已经被初始化了,这个锁位为全局锁

创建局部锁

​pthread t mutex;

pthread mutex init(&mutex,nullptr);​

用完之后销毁

pthread mutex destroy(&mutex);

认识接口

我们要尽可能的给少的代码加锁

加锁过多会使多线程访问变成单线程访问,多线程也就没有意义。

一般加锁都是给临界区加锁

由于为全局锁,所有线程都可访问,那么多线程访问这把锁是安全的吗?

安全,因为申请锁是原子性的。

锁在任何时刻只允许一个线程访问临界资源,也就是说任何时刻只允许一个线程去申请锁,那么必然会有申请锁失败的线程,那些失败的线程如何处理呢?

阻塞线程,等别的线程释放锁。

一个线程在访问临界区资源的时候,可不可能被CPU切换?

可能,完全允许,只是无法进入到加了锁的临界区内,被申请锁阻塞

多线程运行同一份资源,有线程无法持有锁,无法抢到票

这种情况叫线程的饥饿问题,解决饥饿问题,需要将线程按一定顺序进行

相关推荐
jun_bai2 分钟前
Orthanc服务器使用java上传dicom影像文件
java·运维·服务器
无相求码6 分钟前
指针的5层境界,从入门到劝退:C语言指针进阶全解析
c语言
BullSmall9 分钟前
Anolis OS 8.10 Docker 部署 SonarQube 9.9 完整教程
运维·docker·容器
AAA@峥17 分钟前
CentOS7 搭建 ELK 企业级日志集群:从部署到日志可视化完整实战
运维·elk·centos
ZKNOW甄知科技23 分钟前
燕千云深度集成飞书:以AI之力,开启无感IT运维体验
大数据·运维·网络·数据库·人工智能·低代码·集成学习
叮咚侠30 分钟前
docker安装的kibana+elasticsearch,突然kibana界面打不开了
运维·jenkins
nVisual32 分钟前
数据中心机柜负载均衡与三相相位监控方案
运维·网络·负载均衡·数据中心布线·综合布线管理软件
国服第二切图仔34 分钟前
02-breakpoint-system
运维·harmonyos
Molesidy37 分钟前
【GUI】【AWTK】基于开阳平台的GUI界面设计环境搭建
linux·gui·awtk
乐观勇敢坚强的老彭40 分钟前
信奥C++一维数组笔记
开发语言·c++·笔记