关于条件变量最核心的函数是pthread_cond_wait
这个函数不太容易理解的地方在于,它会在使进程陷入休眠之前解锁互斥量,而又在进入休眠之后重新锁定互斥量,相当于在函数内部是这样的:
unlock()
sleep
lock();
所以这个函数调用的时候也很奇怪,先是要锁定住互斥量,然后陷入等待,函数返回之后又要手动解锁互斥量
第二个问题在于条件变量使用的时候总要附加一个普通的变量(比如一个bool flag)
而且使用的时候是这样的
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
bool flag = false;
pthread_mutex_lock(&qlock);
while(!flag)
pthread_cond_wait(&qready, &qlock);
pthread_mutex_unlock(&qlock);
....
这几乎是一种惯例了,为什么?
关于互斥量加锁与解锁的部分很清晰了,只是flag似乎只是一个普通的变量,在这里承担什么角色?返回之后,flag仍然为false的话,又要陷入等待??
这就关乎到一个竞争条件了,pthread_cond_t只是提供了一套基础设置,等待它的就绪,其实只是通过wai使得线程陷入休眠而已,并不是说
内部不停在测试qready的值什么的,而进程解除休眠需要别的进程调用pthread_cond_signal或pthread_cond_broadcast
也就说,条件变量的提供的是一套基础设施,关键的我们需要关心的条件是什么时候调用pthread_cond_signal或pthread_cond_broadcast,这就
是应用程序自己定义的问题了,比如这里,我们在另一个线程里发现flag = true,于是发通知告知所有阻塞在这个条件上的线程.
那么休眠返回后为啥要再测一下flag呢?其实是为了防止返回的之后,条件又变为false了,再次发现多线程程序里的竞争条件层出不穷!