Linux系统编程 | 线程同步概念

Linux系统编程 | 线程同步概念

同步概念

同步,指对在一个系统中所发生的事件之间进行协调,在时间上出现一致性与统一化的现象。

但是,对于不同行业,对于同步的理解略有不同。比如:设备同步,是指在两个设备之间规定一个共同的时间参考;数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致,等等。

但是,在软件编程或者通信行业中所说的同步与生活中大家印象中的同步概念略有差异。“同”字应是指协同、协助、互相配合。主旨在协同步调,按预定的先后次序运行。注意,这里是指按照预定次序执行,而不是同时执行。

线程同步

线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。

例子: 内存中开辟了100字节的空间,现在,线程T1欲填入全1,线程T2欲填入全0。但如果T1执行了填充50个字节全1后失去cpu,轮到T2执行,T2将从头开始在内存里填充全0,那么他将会将T1写过的内容覆盖。当T2时间片使用完毕之后,T1再次获得cpu继续从失去cpu的位置向后写入1,当他执行结束后,内存中的100字节,既不是全1,也不是全0,如下图示:

www.zeeklog.com  - Linux系统编程 | 线程同步概念

产生的这种现象叫做“与时间有关的错误”(time related)。为了避免这种数据混乱,线程需要进行同步。

“同步”的目的,是为了避免数据混乱,解决与时间有关的错误。实际上,不仅线程间需要同步,进程间、信号间等等都需要同步机制。

因此,所有“多个控制流,共同操作一个共享资源”的情况,都需要同步。

由以上分析可知,造成数据混乱原因有以下三个:

  1. 资源共享(独享资源则不会)
    . 调度随机(意味着数据访问会出现竞争)
  2. 线程间缺乏必要的同步机制。

那如何避免这种数据混乱的情况呢?我们可以从造成数据混乱的三个原因入手。

以上3点中,前两点我们是无法改变的。因为在linux系统中,想要提高效率,传递数据,资源必须共享。只要共享资源,就一定会出现竞争。只要存在竞争关系,数据就很容易出现混乱。

所以只能从第三点着手解决。为了避免数据混乱,应该使多个线程在访问共享资源的时候,出现互斥。也就是说,当某个进程访问共享资源时,其它进程就无法该资源,直到该进程放弃这个资源。在linux环境下,有信号量、互斥量、条件变量等方式实现线程间同步。在后续的博文中,将依次介绍这些内容。

---------------

码字不易,点个赞再走呗~

我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。