互斥锁:pthread_mutex_t ,为了使不同线程互斥的使用某个资源。
条件锁:pthread_mutex_t, 为了保证不同线程之间有顺序(通过条件控制)地完成某个流程。
互斥锁比较简单,也可以单独使用。
对于条件锁,通常配合一个互斥锁一起使用,以防止多个线程同时请求pthread_cond_wait()。
1. int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) 等待条件有两种方式:无条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(),其中计时等待方式如果在给定时刻前条件没有满足,则返回ETIMEOUT,结束等待,其中abstime以与time()系统调用相同意义的绝对时间形式出现,0表示1970年1月1日0时0分0秒。 无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的竞争条件(Race Condition)。mutex互斥锁在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。
2. int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_signal(pthread_cond_t *cond);
激发条件有两种形式,pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时按入队顺序激活其中一个;而pthread_cond_broadcast()则激活所有等待线程。
这里需要说明的是pthread_cond_signal,只唤醒阻塞队列上面的一个线程,其他线程仍然阻塞在 条件锁上面,除非有其他线程继续使用pthread_cond_signal继续唤醒阻塞线程。
pthrad_cons_broadcast 唤醒阻塞队列上面的所有线程,但是只有一个线程可以竞争到 互斥锁, 其他线程此时不在阻塞在 条件锁上面,而是阻塞在 互斥锁上面 。直到得到互斥锁的线程 unclock 掉互斥锁,这些线程在继续竞争。
阅读(1654) | 评论(0) | 转发(1) |