zoukankan      html  css  js  c++  java
  • Linux 条件变量函数signal和wait补充

    pthread_cond_wait必须放在pthread_mutex_lock和pthread_mutex_unlock之间
    因为他要根据共享变量的状态来觉得是否要等待,而为了不永远等待下去所以必须要在lock/unlock中
    共享变量的状态改变必须遵守lock/unlock的规则

    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返回后会有原子加锁的行为),所以一来一回会有性能的问题。
    但是在LinuxThreads或者NPTL里面,就不会有这个问题,因为在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的线程),
    而这在上面的放中间的模式下是不会出现的。

  • 相关阅读:
    触发器
    数据库一键退出脚本
    集合
    Android 自定义控件之继承ViewGroup创建新容器
    web学习测试环境
    ref:ubuntu下如何批量修改文件后缀名
    ref:Adding AFL Bloom Filter to Domato for Fun
    ref:phpstorm配置远程调试(xdebug)(docker中)
    ref:PHP反序列化漏洞成因及漏洞挖掘技巧与案例
    ref:【干货分享】PHP漏洞挖掘——进阶篇
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/9689469.html
Copyright © 2011-2022 走看看