Linux多线程编程(二)线程同步之条件变量
条件变量是利用线程间共享的全局变量同步的一种机制。
操作:一个线程等待“条件变量的条件成立”而挂起,另一个线程使得“条件成立”(给出条件成立信号)。
因为条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,所以条件变量总是互斥量同时使用。使用时,条件变量被用来阻塞一个进程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将被重新锁定互斥锁并重新测试条件是否满足。
1、 创建和注销
条件变量的结构:pthread_cond_t
条件变量的初始化
int pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *attr)
cond是一个指向结构pthread_cond_t的指针。
attr是一个指向结构pthread_condattr_t的指针。结构pthread_condattr_t是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_ PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用。
注意初始化条件变量只有未被使用时才能重新初始化或被释放。
条件变量的释放
int pthread_cond_destroy(pthread_cond_t *cond)
2、 等待和激发
条件变量的等待
intpthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
线程解开mutex指向的锁并被条件变量cond阻塞。
线程可以被函数pthread_cond_signal和函数pthread_cond_broadcast唤醒,但是要注意的是,条件变量只是起阻塞和唤醒线程的作用,具体的判断条件还需用户给出,例如一个变量是否为0等等。
intpthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
const structtimespec *abstime);
经历abstime段时间后,即使条件变量不满足,阻塞也被解除。
条件变量的解除改变
int pthread_cond_signal(pthread_cond_t * cond);
释放被阻塞在条件变量cond上的一个线程。多个线程阻塞在此条件变量上时,哪一个线程被唤醒是由线程的调度策略 所决定的。
int pthread_cond_broadcast(pthread_cond_t * cond);
全过程描述:
1、 pthread_mutex_lock();
2、 pthread_cond_wait();
unlock à wait à lock
3、 pthread_mutex_unlock();