Linux下线程的同步与互斥以及死锁问题整理

前言:
在同一个进程中的全局变量不同的线程是能够看到的。之前我们在进程中了解到#####二元信号量,是用来保护临界资源,代码上保护临界区,在两个不同的进程在访问公共资源的时候保证访问的互斥和同步。
那么在线程中,不同的线程共享进程地址空间,为了保护公共的数据,我们也必须要保证线程的互斥和同步。

测试用例:
在一个进程中定义一个全局变量,让两个线程同时对這个公共资源进行累加(累加的次数很大为了看到明显的效果),我们观察现象。
我们知道对一个变量的算数计算不是原子的(分为三步)。
测试代码:主线程和新线程对一个全局变量同时累加5000000次,观察结果

这里写图片描述

运行几次的结果:

这里写图片描述

我们发现在几次的运算之后,有些结果并非符合我们的预期,也就是说這里面有错误,也就是在某一个线程在访问临界资源(count)进行累加的时候,這个线程可能因为调度优先级的原因或者受到信号需要从用户层切换到系统层(系统调用)的时候被切出去了,那么這个时候访问這个count临界资源的可能就是其他线程了,這样就造成了计算结果的错误。
问题:两个线程在什么时候切换的?当有线程发生从用户态到内核态的切换的时候,比如有系统调用的时候,一个线程进入内核态,然后去做其他事情了,這个时候其他线程就会访问count:问题用户态和内核态的概念;
一个变量的累加就必须要进行内核态和用户态的切换,为什么呢? 哪些情况下线程会发生从用户态和内核态的切换?
(linux基本概念笔记模块里面有)
复习和补充:全局变量线程间资源共享(当然局部变量是存放在私有栈
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值