线程同步
说到线程同步,就不得不提一下操作系统。首先,操作系统最小的运行单位是进程。而进程的独立运行单位是线程,也就是说一个进程至少有一个线程。而且,在同一进程里的线程可以共享进程内的资源。
但是为什么需要线程同步呢。说到底,就是共享资源惹的祸。打个比方:桌上有一盒饼干,桌子坐了2个人。假设每个人都不知道别人一次拿了几块饼干,并且不知道别人什么时候拿饼干,而且只有在自己拿饼干的时候才能知道饼干盒里还剩下多少饼干。那么,如果饼干盒里共10块饼干。甲拿了3块饼干,吃了一块之后,把两块饼干放回了盒子(放回饼干时不重新检测饼干盒剩下的饼干)。在甲拿饼干之后,放回饼干之前,乙拿了2块饼干吃掉了。那么,按照假设,甲会认为饼干盒里还有多少饼干?乙认为有多少饼干?实际上有多少饼干?
我们不妨来分析一下。按照时间轴,发生的事件顺序为:
- 甲拿3块饼干。
- 乙拿2块饼干。
- 甲放回2块饼干。
对于甲来说,乙的操作他是看不见的。那么甲在第二次拿饼干之前就会认为:
剩余饼干数 = 总饼干数(10)- 甲拿的饼干数(3)+ 甲放回的饼干数(2)
= 9(块)
对于乙来说,甲的操作他也看不见。同理,乙在第二次拿饼干之前会认为:
剩余饼干数 = 拿饼干之前剩余的饼干数(10-3) - 乙拿的饼干数(2)
= 5(块)
实际上饼干数却是:
10 - 3 - 2 + 2 = 7(块)
看到这里,有些观众朋友就会说,这个比方太扯蛋了。如果说这个比方真的扯蛋,那么我只能说。同理,计算机也很扯蛋。事实上如果不使用特殊手段营造上述比方的条件,根本不会出现上述情况。不是说现实中的人就不需要线程同步了,我认为其实是人在无形中已经完成同步了。
- 1. 人的眼睛可以随时检查饼干盒里的饼干数
- 2. 甲和乙可以互相看到对方的操作
用计算机化点的话说,人眼睛是个监听器,随时随刻都在监听饼干盒里的饼干数。那么大家想想,为什么在计算机中没有用监听机制,而是用了另一中方法(后面会提到)呢。我认为最大的原因是代价太大了,如果使用监听机制,就要求每个线程都必须随时随刻监听共享资源。如果开了10000个线程,就需要10000个监听器。大家可以想象一下10000个监听器的资源消耗是多么的惊人。
那么现代计算机采用的同步机制是怎么回事呢?原理很简单:
- 线程访问共享资源之前给共享资源上一把锁,不允许其他线程访问共享资源
- 在线程结束访问共享资源之后解锁,此时其他线程才有权限访问共享资源
- 如果线程在访问资源时共享资源被上了锁,则阻塞直到共享资源解锁之后,具体是那个线程可以获取访问权限则看系统的调度。
用同步的方法来演示一下上述的比方:
- 饼干盒上锁(形象点就是甲大喊一声这是我的饼干,谁都不许碰)甲拿3块饼干
- 此时乙想去拿2块饼干,但是饼干盒上了锁(甲不许他拿),乙进入等待状态(等甲心情好了在去吃饼干)
- 甲放回2块饼干,饼干盒解锁。(甲吃了一块饼干,觉得吃饱了,放回了2块饼干,对乙说我吃饱了,要吃你就拿过 去吃吧)
- 饼干盒上锁,乙拿2块饼干。(现在饼干归我了,其他人不许吃我的)
- 饼干盒解锁。(乙也吃饱了)
注意:千万记得在使用资源之后解锁,大家可以去试试不解锁会出现什么情况。
我理解的线程同步就是这么回事。
相关推荐
线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。 举例1: 银行存款 5000。柜台,折:取3000;提款机,卡:取 3000。剩余:2000 举例2...
C#线程同步的几种方法 C#线程同步的几种方法
.NET多线程同步方法详解(一):自由锁(InterLocked) 本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,...
1.使用三种VC的多线程同步方法编写一个多线程的程序(要求在屏幕上先显示Hello,再显示World)。 1)基于全局变量的多线程同步程序; 2)基于事件的多线程同步程序; 3)基于临界区的多线程同步程序。
MFC 多线程及线程同步 MFC 多线程及线程同步 MFC 多线程及线程同步
java线程同步java线程同步java线程同步
简单学习用例,利用线程锁对线程同步进行控制,保证对公共资源的访问不出现错误!
本文件为操作系统中的线程同步实验的实验报告,有详细的代码和解释。
线程同步的四种方法的代码。事件 互斥量 信号量 临界区
多线程中的同步问题的几种解决方案,新手可以看看。主要通过临界区线程同步,互斥内核对象、事件内核对象,信号量内核对象来实现线程同步问题。
介绍了linux线程同步的所有方式,包括互斥、自旋、信号量、条件变量等技术
操作系统实验 多线程同步与互斥 java编写 可动态创建
通过模拟公交车运行时,司机,售票员以及乘客之间的同步状态来实现线程同步
很不错的Delphi多线程和线程同步的例子,完整源码 原来的一个不知道CSDN怎么把文件搞丢了!新传一个资源,包含一个线程排序的例子!代码均搜集自网上!
C#_线程同步lock,Monitor,Mutex,同步 互斥 监控 锁
简单实现多线程同步示例(模拟购票系统),内容为实现多线程同步过程,模拟购票系统进行同步购买情况;该处并未考虑线程守护问题,后期将对线程锁等安全问题进行初步研究!
C#线程同步,多个线程去执行,检测到最后一个线程执行完成,主线程继续执行其他业务AutoResetEvent
本工程中包含了线程同步的五种方法,现在拿出来和大家一起分享,VC6.0编译测试通过,工程中包含了5个小工程,具体讲述每种线程同步方法的具体使用列子,而且有详细的注释。
线程同步技术剖析!! 自己看了还不错!需要的下吧
多线程同步解决卖票问题