首先声明本篇文章只解释概念和原理,并不会给出代码举例,我相信如果你写了相关代码但是对相关概念百思不得其解时,看了这篇文章应该会茅塞顿开。
首先要明白线程同步能解决什么问题,先给出一个竞态条件的概念
竞态条件(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。你丢了钱,但银行系统可能完全察觉不到,因为它“逻辑自洽”地执行了两次操作。线程的执行顺序是由操作系统内核调度的,其运行规律并不简单地为“先创建先执行”。
线程同步是解决多个线程并发执行时的时序问题(或者说执行顺序问题,本质上是执行时间先后问题)解决竞态条件最有效的方法是锁机制或者锁机制+条件变量的方式(该方法可以看我的另一边文章,链接附在下面了,自取),锁机制只是实现线程同步的一种方法。
这里说到并发我就提一嘴,自行去了解并发和并行的区别。
为了更好理解相关概念,再举个例子说明为何要引入线程同步机制
一个精妙的比喻:接力赛跑
没有同步的多线程就像一群人在混乱地抢夺一个球(共享资源),不知道谁先谁后,球可能被损坏。
实现了同步的多线程就像一场接力赛跑:
——跑道(共享资源) 一次只允许一个队伍的一名队员(线程) 奔跑。
——下一位队员必须在交接区(获取锁) 等待。
——只有当前队员交棒(释放锁) 后,下一位队员才能开始跑(执行操作)。
——交棒这个动作,不仅明确了先后顺序,也明确地传递了“比赛进行到了哪一棒”这个状态(数据的最新值)。
解决线程同步问题之信号量
2055

被折叠的 条评论
为什么被折叠?



