互斥量和条件变量的理解
在linux下进行c++编写多线程程序时,基本上都会涉及到同步与互斥的情况.
首先来说下互斥.比如说多个线程都需要对同一个变量X进行操作,但是在线程A对X进行操作时,如果线程B,C,D...也来同时进行,这就乱套了,都不知道是谁操作的结果.所有我们需要给这个变量加一把锁,等某一个线程操作完了,下一个线程才能进行操作.也就是说各个线程对X的操作是互斥的.
接下来说说条件变量.比如我要等待变量X达到某一条件值(比如X>10),这时我才进行相关的处理.这时候,我就有可能需要时时刻刻都要关心这个条件是否成立,这有可能就需要不停的进入临界区查看条件是否成立,这样频繁的消耗CPU.而且每次进入临界区,别人无法进入的话,就什么也干不了.看来轮询不是一个好办法,如果是条件一成立,别人发来一个通知,这时候再进行处理,这样就好多了.条件变量就是用来实现这种逻辑的.使用条件变量是和锁一起出现的.其流程大概是这样的:线程A获取锁,进入临界区,检查条件,发现X<=10,于是就调用pthread_cond_wait(),先把锁去掉,好让别的线程可以进行工作,然后呢,然后线程A就睡了,等条件发生.然后别的线程修改完数据后,触发了条件,于是给线程A发了一个消息,速度起床干活,于是线程A就被唤醒了,同时获取了锁,然后开始干活,干完了将锁交出去.就是这样.