日期:2014-05-16  浏览次数:20687 次

线程同步中条件变量的问题
在APUE中线程的条件变量的一个问题:
void
process_msg(id)
{
   struct msg *mp;
   
  for(;;){
    pthread_mutex_lock(&qlock);
    while(workq == NULL)
       pthread_cond_wait(&qready, &qlock);
    mp = workq;
    pthread_mutex_unlock(&qlock);
  }
}

APUE上说“关闭了条件检查和线程进入休眠状态等待条件改变这两个操作之间的时间通道”,说的是条件检查“while(workq == NULL)”和进入休眠等“pthread_cond_wait(&qready, &qlock);”这两个操作吗?
------解决方案--------------------
是的,这样就保证条件不会在条件检查完毕而进入休眠前修改,导致可能的一直休眠
------解决方案--------------------
别想太多,若想深入,可以看下pthread_cond_wait的实现
可以简单认为pthread_mutex_lock(&qlock);
while(workq == NULL)仅仅只是对这个条件上锁
pthread_cond_wait要是等待到,内部会立即上锁(这个时候定有人改变了workq这个条件)
若等待不到,其会立即释放这个锁qlock