linux中的线程同步

首先声明本篇文章只解释概念和原理,并不会给出代码举例,我相信如果你写了相关代码但是对相关概念百思不得其解时,看了这篇文章应该会茅塞顿开。

首先要明白线程同步能解决什么问题,先给出一个竞态条件的概念

竞态条件(Race Conditio) : 是指在多线程或多进程环境中,多个线程或进程访问和修改共享资源时,由于执行顺序的不同,导致程序的行为和结果依赖于线程或进程的执行顺序。这种条件通常会导致不可预测的错误和数据不一致问题。

说到这大家可能会有一些疑问,“导致不可预测的错误和数据不一致问题”是什么错误呢,这里给大家举个例子:

经典例子:银行转账​

假设共享变量 balance = 100。线程A要存入50,线程B要取出20。

​正确的最终结果应该是:​​ 100 + 50 - 20 = 130

但由于没有同步,可能会发生这样的交错执行:

线程A ​​读取​​ balance = 100

线程B ​​读取​​ balance = 100

线程A ​​计算​​ 100 + 50 = 150

线程B ​​计算​​ 100 - 20 = 80

线程A ​​写入​​ balance = 150

线程B ​​写入​​ balance = 80<-- 线程A的操作被覆盖了!

最终,balance变成了 ​​80​​,而不是 ​​130​​。你丢了钱,但银行系统可能完全察觉不到,因为它“逻辑自洽”地执行了两次操作。

线程的执行顺序是由操作系统内核调度的,其运行规律并不简单地为“先创建先执行”。

线程同步是解决多个线程并发执行时的时序问题(或者说执行顺序问题,本质上是执行时间先后问题)解决竞态条件最有效的方法是锁机制或者锁机制+条件变量的方式(该方法可以看我的另一边文章,链接附在下面了,自取),锁机制只是实现线程同步的一种方法。

这里说到并发我就提一嘴,自行去了解并发和并行的区别。

如何用条件变量+互斥锁完美解决线程同步问题​-CSDN博客

为了更好理解相关概念,再举个例子说明为何要引入线程同步机制

一个精妙的比喻:接力赛跑

没有同步的多线程就像一群人在混乱地抢夺一个球(共享资源),不知道谁先谁后,球可能被损坏。

实现了同步的多线程就像一场​​接力赛跑​​:

​——跑道(共享资源)​​ 一次只允许一个队伍的​​一名队员(线程)​​ 奔跑。

——下一位队员必须​​在交接区(获取锁)​​ 等待。

——只有当前队员​​交棒(释放锁)​​ 后,下一位队员才能开始跑(执行操作)。

——交棒这个动作,不仅明确了先后顺序,也明确地传递了“比赛进行到了哪一棒”这个​​状态(数据的最新值)​​。

解决线程同步问题之信号量

看这篇文章:信号量解决线程和进程同步问题:从原理到实战-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值