打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于 多线程中互斥锁和条件锁的理解
互斥锁: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 掉互斥锁,这些线程在继续竞争。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
pthread_cond_wait().
多线程互斥
linux 线程学习之条件变量
Linux系统编程—条件变量
linux多线程pthread的用法和linux下定时器的用法
pthread条件变量函数的使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服