[Linux]——Linux线程互斥

Linux线程互斥

上一篇博客中我们介绍了Linux下对线程控制的简单操作,其实就光单单论线程控制函数的使用来说控制线程并不是一件很难的事,但是线程控制真正抛给我们的难题恐怕并不是仅仅会使用函数而已,本篇博客就带领大家详细的探讨一下Linux下的线程互斥问题。

线程并发操作带来的一些问题

并发在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。戳这个搞笑视频或许能帮你加深理解
所以并发可能存在某一时刻会对共享资源进行同时访问,如果在对这些共享资源不遵循规则,那么就可能对这些共享资源造成破坏。多说无益,我们使用一个最简单的代码来阐述并发出现的问题。

在这里插入图片描述
结果你认为是20000000,但是实际上令人大跌眼镜,这如果是钞票的话,笔者已经哭死在厕所
在这里插入图片描述
那么造成上面结果的原因是什么呢?来看下图,因为程序是并发运行的,所以不同的线程在执行时可能不同的寄存器同时取走了某一时刻的goal,对他们分别进行++后结果都变成了2,最后写回内存结果从预期的三变成了2,这里的根本原因是++这个操作并不是原子的,有的同学一脸震惊,这里不明摆着是一句代码吗,怎么就不是原子的了
在这里插入图片描述
来看我们在vs2013下一段简单的反汇编代码:从图中你清楚的可以看到对于goal的++操作分解成了三步,所以这就是导致上面问题的罪魁祸首
在这里插入图片描述
为了下面更好的理解互斥问题,我们这里给大家提几个简单的概念:

  • 临界资源:多线程执行流共享的资源叫做临界资源,比如上述栗子中的goal变量
  • 临界区:每个线程内部,访问临界资源的代码,就叫做临界区,如上述代码的goal++
  • 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界区起保护作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值