用条件变量时信号为什么不会丢失?

条件变量典型的用法如下:

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、如果可以的话,希望能帮助理清一下这个程序的执行流程。

阅读 3.1k
1 个回答

pthread_cond_signal不会发生你所说的第二种情况。pthread_cond_signal调用的时候,会唤醒正在等待该条件的线程,如果不止一个线程正在等待,则选择一个唤醒(注意这里是选择一个,所以不可能有多个等待线程同时被唤醒),一般是按照时间顺序唤醒,最先等待的最先被唤醒。

但是第二种情况在使用pthread_cond_broadcast的时候是有可能发生的。pthread_cond_broadcast会唤醒所有正在等待的线程,让它们自己去竞争锁,谁能拿到谁就继续执行,否则就继续阻塞。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏