2013年1月11日星期五

多线程条件变量和互斥锁的使用

        多线程同步,是多线程编程中肯定会遇到的问题。常见的有pthread_mutex_t、pthread_rwlock_t和pthread_cond_t,前面两个是锁,后面叫条件变量(条件成立时,通知通过阻塞线程的机制;其中条件的修改是需要锁来保护的)。
        条件变量需要和互斥锁以及一个条件结合使用,条件表示某一种情况的达成,比如队列中有元素,可以去取元素了,互斥锁用来使多线程对条件的修改原子化,条件变量用来做通知,向队列放元素的线程通知取元素线程你们可以来取元素了。
        这里有一个令人头疼的问题,就是pthread_cond_signal()和pthread_cond_broadcast()函数是在锁内调用还是在锁外调用,如下:
         1、
         pthread_mutex_lock(&lock);
         pthread_cond_signal(&cond);
         pthread_mutex_unlock(&lock);

         2、
         pthread_mutex_lock(&lock);
         pthread_mutex_unlock(&lock);
         pthread_cond_signal(&cond);

         这个问题,考虑是否浪费了CPU,考虑任务的调度机制,令人头疼;最后在starckoverflow看到一种解释,我觉得很好:不要考虑以上那些不确定的因素,考虑代码正确性就可以,修改条件和通知其它线程条件被修改应该是在一起的,所以放到锁内更好理解。

         另外一点需要注意的是,条件判断使用while循环。
         pthread_mutex_lock(&lock);
         while(cond == NULL) {
                  pthread_cond_wait(&cond, &lock);
         }
         pthread_mutex_unlock(&lock);

没有评论:

发表评论