Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71081
  • 博文数量: 16
  • 博客积分: 392
  • 博客等级: 一等列兵
  • 技术积分: 201
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-24 09:21
文章分类

全部博文(16)

文章存档

2012年(16)

我的朋友

分类: LINUX

2012-09-29 10:10:03

互斥锁: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 掉互斥锁,这些线程在继续竞争。
阅读(1658) | 评论(0) | 转发(1) |
0

上一篇:(转)Linux IO多路复用之epoll网络编程

下一篇:没有了

给主人留下些什么吧!~~