1.基础概念
互斥量: 就是最基本的锁,利用上锁和开锁使多个线程在竞争区域串行化。是最基础的同步量,条件变量必须和一个互斥量相关联,而暂时所接触到的作为线程同步量使用的信号量,一般也是和互斥量共同使用的。拒我暂时的理解,其他两个同步量可以说是,一种对于互斥量的扩展。
条件变量: 编程中经常会遇到这样的情景,角色A接下来步骤的进行,需要依赖于某个状态a,而状态a由角色B去改变。如果在串行中的话,这个角色大致就相当于函数,例如A need f(a),a need B。转换到并行的语境,A和B不再是串行执行的“步骤”,而是两个并行执行的线程,因此线程A和线程B就需要同步。这个情景使用互斥量是可以实现的,但是从CPU利用、响应速度各方面来说,单纯用互斥量来实现的方案都不怎么好。因此,就推出了条件变量这个同步量,专门解决这个情景。
信号量: 据我现在粗浅的接触,信号量又是一个相对来说,比条件变量解决的问题域要更窄一点的同步量。暂时所知,主要就是解决生产者-消费者问题,还有限流问题这些有关于控制线程数量的问题。sem_init(sem, 0, val)中的val需要区分一下,这是信号量的初始值,而存在一个信号量的最大值,这个信号量的最大值和允许“工作”的线程的最大值是完全不同的概念。former只不过是linux系统中限制的,信号量可设置的最大值。而later我认为,就是取决于信号量的初值,假设一开始为5,5个“工作”线程被允许“工作”,然后信号量减为0,其他“工作”线程就被阻塞了。那么被阻塞的“工作”线程,什么时候才能开始“工作”呢?只有等“工作”中的线程“工作”完了,然后调用sem_post()将信号量增加回去才行。如果一直这样正常“工作”,那么后续的过程都会是这样出出入入的,而正在“工作”的线程将会保持在5,也就是信号量的初值。
待续。。。