线程并发-原子操作与临界区

95 阅读2分钟

前言

在并发编程中,多个线程对同一个资源进行访问可能会互相干扰,这种情况被称为竞争条件。造成竞争条件的根本原因在于线程在进行某些操作的过程中被中断,虽然线程再次运行时其状态会恢复如初,但是外界环境可能在此时间段内已经发生了改变。为了解决这个问题,我们引入原子操作与临界区这两个概念。

原子操作

原子操作意为“执行过程中不可被中断的一个或一系列操作”。原子操作必须由一个单一的汇编指令表示,并且需要得到芯片级的支持,因此原子操作是线程间交互数据最细粒度的同步操作,它可以保证线程间读写某个数值的原子性,绝对的并发安全。原子操作只能完成一些最基本的功能,一共有五种:增或减、比较并交换、载入、存储和交换

临界区

相比于原子操作,让串行化执行的若干代码形成临界区的做法更加通用。临界区在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,以此达到用伪原子方式操作共享资源的目的。原子操作和临界区看起来类似,但是原子操作不能被中断,临界区对是否能被中断没有强制规定,只要保证一个访问者在临界区中时其他访问者不允许进入。
临界区常见的同步方式互斥量与条件变量