线程同步-条件变量和信号量

介绍很详细的文章 ---》条件变量详解

主要的函数有如下几个

pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr);

进行初始化的函数

 

初始化的方式有两种,可以直接使用宏直接对变量进行定义

可以用宏PTHREAD_COND_INITIALIZER来初始化静态定义的条件变量,使其具有缺省属性

pthread_cond_t cv = PTHREAD_COND_INITIALIZER;

 

#include 
int pthread_cond_wait(pthread_cond_t *cv,
pthread_mutex_t *mutex);
返回值:函数成功返回0;任何其他返回值都表示错误

函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。

被阻塞的线程可以被pthread_cond_signal函数,pthread_cond_broadcast函数唤醒,也可能在被信号中断后被唤醒。

pthread_cond_wait函数的返回并不意味着条件的值一定发生了变化,必须重新检查条件的值。

pthread_cond_wait函数返回时,相应的互斥锁将被当前线程锁定,即使是函数出错返回。

一般一个条件表达式都是在一个互斥锁的保护下被检查。当条件表达式未被满足时,线程将仍然阻塞在这个条件变量上。当另一个线程改变了条件的值并向条件变量发出信号时,等待在这个条件变量上的一个线程或所有线程被唤醒,接着都试图再次占有相应的互斥锁。

阻塞在条件变量上的线程被唤醒以后,直到pthread_cond_wait()函数返回之前条件的值都有可能发生变化。所以函数返回以后,在锁定相应的互斥锁之前,必须重新测试条件值。最好的测试方法是循环调用pthread_cond_wait函数,并把满足条件的表达式置为循环的终止条件。如:

pthread_mutex_lock();
while (condition_is_false)
 pthread_cond_wait();
pthread_mutex_unlock();

阻塞在同一个条件变量上的不同线程被释放的次序是不一定的。

 

心得:

在阻塞时, pthread_cond_wait();函数会释放互斥锁,让其他线程去继续执行

pthread_cond_signal (pthread_cond_t *cond) ;函数只对当前阻塞的条件有效,不会累计。

pthread_cond_broadcast (pthread_cond_t *cond) ;唤醒所有cond绑定的阻塞

你可能感兴趣的:(linux,条件变量)