Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104465
  • 博文数量: 19
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 57
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-28 09:40
个人简介

静下心,不浮躁,方能得智慧

文章分类
文章存档

2015年(7)

2014年(12)

我的朋友

分类: LINUX

2015-12-10 10:17:55

原文地址:pthread_cond_wait详解 作者:jazeltq

对pthread_cond_wait一直不是很理解,看到一篇文章写的不错,原文在这里,

http://www.ibm.com/developerworks/cn/linux/thread/posix_thread3/#1


下面说一下,pthread_cond_wait(&mycond,&mymutex)的东西
1. 设计pthread_cond_wait 的初衷

   线程如果需要等待某个条件发生,它该作何处理呢?它可以重复对互斥对象锁定和解锁,每次都会检查共享元素,以查找某个值。这样会比较浪费cpu的时钟周期。而且效率比较低,何不借鉴一下dma的处理办法,等待某个条件发生了通知一下,这样cpu就可以处理自己的事了,我想pthread_cond_wait的初衷就是这样的,也是这样被设计出来的。如果你有不同解释可以通知我,我们可以共同讨论。

2. pthread_cond_wait的内部操作
   在调用之前需要锁定互斥对象,然后再调用pthread_cond_wait。
  1> pthread_cond_wait所做的第一件事就是同时对互斥对象解锁(这样其它线程就可以修改共享对象了,操作之前不要忘记加锁哦)。
  2> 等待条件通常是一个阻塞操作(这一点有点不明白,为什么是通常,难道说是还有其它动作,有知道的可以告诉我啊),这意味着线程将睡眠,在它苏醒之前不会消耗cpu周期(这正是我们想要的).线程睡呀睡呀,直到,有人叫它, 比如:另一个线程锁定了mymutex,并对共享对象对了某个动作.在对互斥对象解锁之后(this is very important),2号线程会立即调用函数pthread_cond_broadcast(&mycond)(这个地方也有点不明白, 我想不一定需要立即调用pthread_cond_broadcast,日比如有一个共享的线程数目 pthread_num = 5,当创建一个线程的时候pthread_num++,但是当该线程结束的时候pthread_num--,如果这个数小于5,我们就可以广播一下这个事件,激活一个线程,用以创建更多的线程)。
  3> 调用pthread_cond_wait的线程被叫醒之后,将重新锁定mymutex,之后才返回。

下面画个图来表示一下期间锁的调用(是伪码)

lock(mutex)   ----------------a.lock
pthread_cond_wait()
{
    unlock(mutex)-------------a.unlock
    if ( 条件不满足)
      睡觉
    else
    {
      lock(mutex)-------------b.lock
      return
    }
}

dosomething();

unlock(mutex);---------------b.unlock

这样就可以看出来锁的调用了吧。


阅读(2034) | 评论(0) | 转发(0) |
0

上一篇:linux下删除指定文件之外的其他文件

下一篇:没有了

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