关于条件变量最核心的函数是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了,再次发现多线程程序里的竞争条件层出不穷!