条件变量典型的用法如下:
pthread_mutex_lock(&m);
while(c==true)
pthread_cond_wait(&cond, &m);
dosomething();
pthread_mutex_unlock(&m);
1、主线程中调用pthread_cond_wait时会释放互斥锁,然后挂起主线程,并等待条件变量的发生变化,当其他线程调用pthread_cond_signal时,如果互斥锁是被锁住的,那么主线程中的pthread_cond_wait会等互斥待锁被解锁后,然后再给互斥锁上锁后再返回吗?
2、如果正如1中的描述那样的话,pthread_cond_wait收到了pthread_cond_signal发来的信号,但是未锁定互斥锁之前,又被其他线程抢了先,锁住了互斥锁,那不是pthread_cond_wait还得挂起等待互斥锁被解锁?
3、如果可以的话,希望能帮助理清一下这个程序的执行流程。
pthread_cond_signal
不会发生你所说的第二种情况。pthread_cond_signal
调用的时候,会唤醒正在等待该条件的线程,如果不止一个线程正在等待,则选择一个唤醒(注意这里是选择一个,所以不可能有多个等待线程同时被唤醒
),一般是按照时间顺序唤醒,最先等待的最先被唤醒。但是第二种情况在使用
pthread_cond_broadcast
的时候是有可能发生的。pthread_cond_broadcast
会唤醒所有正在等待的线程,让它们自己去竞争锁,谁能拿到谁就继续执行,否则就继续阻塞。