最近在看操作系统有关线程同步的章节,关于 信号量 , 条件变量 , 互斥量 之间的具体区别有点分不清楚,所以在这里记录一下
信号量 , 条件变量, 互斥量
首先信号量,条件变量,互斥量都是有关操作系统线程同步的有关知识,我相信在每一本操作系统教材上都有提到过,下面我写一下我自己理解
互斥量: 互斥量总是和互斥锁相联系,我们所说的互斥锁本质上就是锁住一个互斥量,所以互斥量只有两种情况- 被上锁状态
- 解锁状态
- 所以就可以用
0,-1表示 ,0表示自由, 没有被上锁,-1表示已经被上锁
信号量: 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。- 按我的理解,信号量就是用来表示某个资源可以被其他线程同时获取的数量, 比如信号量为 5,可以允许对做5个线程对资源进行获取,当然每个线程获取之前,必须将信号量减一, 而每个线程释放之后,有必须将信号量加一,以供其他资源获取.
- 当信号量初始化最大为1时,此时只允许同时有一个线程对资源进行操作, 那么也就是互斥了,那么这就形成了一把互斥锁,所以
二值信号量我们可以当做一把锁来用 .
条件变量: 条件变量 ( cond ) 是在多线程程序中用来实现"等待 –> 唤醒" 逻辑常用的方法。条件变量利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使“条件成立”。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。线程在改变条件状态前必须首先锁住互斥量,函数 pthread_cond_wait 把自己放到等待条件的线程列表上,然后对互斥锁解锁(这两个操作是原子操作)。在函数返回时,互斥量再次被锁住。- 众所周知,如果要防止多个线程对资源进行竞争, 最简单粗暴的方法就是对该资源进行上锁,但是用个问题,一旦 某个线程想要获取某个上锁的线程,它只能
等待->尝试获取->失败->尝试获取->等待,如此的循环自旋是比较消耗 CPU 资源的,所以就需要条件变量. - 条件变量的作用就是让获取不过锁的线程休眠,然后在释放 锁/条件变量 的时候唤醒休眠的线程.
- 所以条件变量 = 上锁/解锁 + 休眠/唤醒 线程的组合操作 , 它把这两个操作放在一起,构成了一个原子操作.
- 众所周知,如果要防止多个线程对资源进行竞争, 最简单粗暴的方法就是对该资源进行上锁,但是用个问题,一旦 某个线程想要获取某个上锁的线程,它只能
- 互斥量是信号量的一种特例,互斥量的本质是一把锁。A mutex is basically a lock that we set (lock) before accessing a shared resource and release (unlock) when we’re done
基于信号量的生产者消费者模型
|
|
执行结果:
|
|