免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kaede_1
打印 上一主题 下一主题

[C] Linux下条件变量的信号丢失指的是什么? [复制链接]

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
1 [报告]
发表于 2014-08-21 14:07 |显示全部楼层
回复 7# windoze


    pthread_cond_signal 不需要 锁啊。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
2 [报告]
发表于 2014-08-21 17:41 |显示全部楼层
回复 17# windoze


看了下man pthread_cond_signal, 没发现信号丢失的情况,
pthread_cond_wait在释放外部的mutex之前,已经保存好老的信号的状态,然后会锁住cond的内部mutex,再查看信号的新状态,如果有人触发就没有必要睡眠直接pass退出, 否则睡眠。
pthread_cond_signal进来就会锁住cond的内部mutex, 然后触发新的信号,同时如果有人在等待睡眠就**,否则直接pass退出。

所以cond的内部状态会有另外一个锁保护, 跟外部的锁没关系,所以应该不会有竞态条件。

而且如果你看看glibc的代码,他自己在内部使用条件变量的时候pthread_cond_signal也没有锁保护。




论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
3 [报告]
发表于 2014-08-22 09:59 |显示全部楼层
回复 21# windoze


    pthread_cond_wait 那样是实现完全没问题,相当于在睡眠之前做一次double check, 避免了无谓的睡眠,
你确定"condition variable naked signal"能google到信号丢失? 能不能直接给啊

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
4 [报告]
发表于 2014-08-22 15:50 |显示全部楼层
回复 23# windoze


    果然够专业, 论文都搬出来了, 下面是论文里面描述的信号丢失的情况,看到没后面有个解决方案:
解决方案就是在睡眠之前再检查一次有没有naked notify 产生,

- RACE problem, and notify can be lost. How?
  + since NOTIFY is just a hint
  + a process in the monitor, find <OK to proceed> to be FALSE, about to WAIT
        (of course, in this case, process is holding monitor lock)
  + now, device does a naked NOTIFY, it does not need to acquire lock
  + The WAIT then be done, and the NOTIFY is lost
- Note: this never happens if device requires to hold lock before doing NOTIFY
- Solution:
  + add a binary state to conditional variable.
  + whenever there is a naked notify, that bit is turned on
  + WAIT then check for that state before do a really wait
  + update to this state need to be atomic
  + this is similar to binary-semaphor
  
  
下面是linux的实现, 从”man pthread_cond_signal“ 搬出来的

              pthread_cond_wait(mutex, cond):
                  value = cond->value; /* 1 */
                  pthread_mutex_unlock(mutex); /* 2 */
                  pthread_mutex_lock(cond->mutex); /* 10 */
                  if (value == cond->value) { /* 11 */
                      me->next_cond = cond->waiter;
                      cond->waiter = me;
                      pthread_mutex_unlock(cond->mutex);
                      unable_to_run(me);
                  } else
                      pthread_mutex_unlock(cond->mutex); /* 12 */
                  pthread_mutex_lock(mutex); /* 13 */

              pthread_cond_signal(cond):
                  pthread_mutex_lock(cond->mutex); /* 3 */
                  cond->value++; /* 4 */
                  if (cond->waiter) { /* 5 */
                      sleeper = cond->waiter; /* 6 */
                      cond->waiter = sleeper->next_cond; /* 7 */
                      able_to_run(sleeper); /* 8 */
                  }
                  pthread_mutex_unlock(cond->mutex); /* 9 */

看起来linux的实现跟论文solution描述的产不多,真正的睡眠之前会检查下有没有signal产生, 也就是判断value == cond->value
如果有signal产生value == cond->value是false, linux不管signal 是不是naked, 在signal的时候会递增cond->value
这是安全的, 因为cond还有个内部锁cond->mutex保护
在cond->mutex保护下, 不管是pthread_cond_wait先跑还是pthread_cond_signal都没关系, 不会产生信号丢失。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
5 [报告]
发表于 2014-08-22 16:48 |显示全部楼层
回复 25# windoze


    如果 ”不保证每次调用pthread_cond_signal的时候等待条件一定能满足“, 那就是编程错误了, 跟pthread_cond_signal是不是naked有什么关系么?

能不能把你肚子里的东西全部倒出来啊,一点一点挤累死我了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP