• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-06-04)  Linux编程问题 |   28 条评论  21 
    文章评分 0 次,平均分 0.0

    在Linux下Posix多线程编程中,有两个很重要的函数,pthread_cond_wait和pthread_cond_signal。他们应该放在哪里呢?
    第一种:

    pthread_mutex_lock 
    XXXXXXXXXXXXXXXXXXXXXXX
    pthread_mutex_unlock 

    第二种:

    pthread_mutex_lock 
    pthread_mutex_unlock  
    XXXXXXXXXXXXXXXXXXXXXXX 

    来看看pthread_cond_wait ,应该采用第一种还是第二种呢?
    因为pthread_cond_wait 会先解锁,然后休眠。所以 pthread_cond_wait 必须选择第一种,使用mutex来保护。 所以pthread_cond_wait必须放在pthread_mutex_lock和pthread_mutex_unlock之间,因为他要根据共享变量的状态来觉得是否要等待,而为了不永远等待下去所以必须要在lock/unlock队中。
    再来看看pthread_cond_signal ,应该采用第一种还是第二种呢?
    从编程规则上说,其他两种都可以,pthread_cond_signal即可以放在pthread_mutex_lock和pthread_mutex_unlock之间,也可以放在pthread_mutex_lock和pthread_mutex_unlock之后,但是各有有缺点。
    之间:

    pthread_mutex_lock
        xxxxxxx
    pthread_cond_signal
    pthread_mutex_unlock

    缺点:在某些线程的实现中,会造成等待线程从内核中唤醒(由于cond_signal)然后又回到内核空间(因为cond_wait返回后会有原子加锁的行为),所以一来一回会有性能的问题。但是在Linux Threads或者NPTL(Posix线程库)里面,就不会有这个问题,因为在Linux 线程中,有两个队列,分别是cond_wait队列和mutex_lock队列, cond_signal只是让线程从cond_wait队列移到mutex_lock队列,而不用返回到用户空间,不会有性能的损耗。
    所以在Linux中推荐使用这种模式。
    之后:

    pthread_mutex_lock
        xxxxxxx
    pthread_mutex_unlock
    pthread_cond_signal

    优点:不会出现之前说的那个潜在的性能损耗,因为在signal之前就已经释放锁了
    缺点:如果unlock和signal之前,有个低优先级的线程正在mutex上等待的话,那么这个低优先级的线程就会抢占高优先级的线程(cond_wait的线程),而这在上面的放中间的模式下是不会出现的。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/1372.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享