线程的同步与锁简介之:信号量,互斥体,临界区

来自《程序员的自我修养》一书某节,手打抄录代为笔记。简洁的介绍,适合已知道这些概念并温故而知新的同学,比如我,因为有介绍其区别。

为了避免多个线程同时读写一个数据而产生不可预料的后果,我们需要将各个线程对同一个数据的访问做同步。所谓同步,既是指在一个线程访问数据未结束的时候,其他线程不得对同一个数据进行访问。如此,对数据的访问被原子化了。
同步最常见的方式是锁(Lock)。锁是一种非强制机制,每一个线程在访问数据或资源前首先试图获取(Acquire)锁,并在访问之后释放(Release)锁。在锁已经被占用的时候试图获取锁时,线程会等待,直到锁重新可用。
二元信号量(Binary Semaphore)是最简单的一种锁,它只有两种状态:占用 与 非占用。它适合只能被唯一一个线程独占访问的资源。当二元信号量处于非占用状态下时,第一个试图取得该二元信号量的线程会获得该锁,并将二元信号量置为占用状态,此后其他的所有试图获取该二元信号量的线程将会等待,直到该锁被释放。
对于允许多个线程并发访问的资源,多元信号量简称信号量(Semaphore),它是一个很好的选择。一个初始值为N的信号量允许N个线程并发访问。线程访问资源的时候首先获取信号量,进行如下操作:
-- 将信号量的值减1
-- 如果信号量的值小于0,则进入等待状态,否则继续执行。

   访问完资源后,线程释放该信号量,进行如下操作:
-- 将信号量的值加1.
-- 如果信号量的值小于1,唤醒一个等待的线程。(博主注:原文的这句话猛然看起来有点小晕,个人倾向于表达为:如果信号量的值大于0,则唤醒等待的线程)

互斥体(Mutex)和二元信号量很像,资源仅同时允许一个线程访问,但和信号量不同的是,信号量在整个系统内可以被任意线程获取并释放,也就是说,同一个信号量可以在系统内的一个线程获取之后由另一个线程释放。而互斥体则要求哪儿个线程获取了互斥体,哪儿个线程就要负责释放这个锁,其他线程越俎代庖去释放互斥体是无效的。

临界区(Critical Section)j是比互斥体更加严格的同步手段,在术语中,把临界区的锁的获得称为进入临界区,而把锁的释放称为离开临界区。临界区和互斥体与信号量的区别在于,互斥体和信号量在系统内的任何线程里都是可见的,也就是说,一个进程创建了互斥体或信号量,另一个进程试图获取该锁是合法的。然而,临界区的作用范围仅限于本进程,其他的进程无法获取该锁。除此之外,临界区具有和互斥体相同的性质
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值