首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待可读文件描述符和可写文件描述符

等待可读文件描述符和可写文件描述符
EN

Stack Overflow用户
提问于 2017-02-03 01:06:25
回答 1查看 212关注 0票数 2

我需要等待从文件描述符A读取的东西,然后只有当文件描述符B可写时才读取它。我的第一个实现是这样的(伪代码):

代码语言:javascript
复制
while (true) {
  select(A readable, B writeable, timeout)
  if (A was readable and B was writeable) {
    ReadFromAWriteToB();
  }
}

这就产生了这样的问题,即select在出现其中一个条件时返回。这是一个问题,因为A是可读的,有10%的时间是可读的,但是B是可写的,90%的时间是可以写的,所以它会醒来给B写,即使我们通常没有从A读取的任何数据。

我的下一个实现如下:

代码语言:javascript
复制
while (true) {
  select(A readableB, timeout);
  if (A was readable) {
    select(B writeable, 0); // Check if it is writeable right now
    if (B was writeable) {
      ReadFromAWriteToB();
    }
  }
}

这是更好的,但我得到的峰值A是可读的,所以第一个选择立即返回,但B是不可写的,所以我会进入一个繁忙的循环,直到B再次可写。

所以我可以在第二个选择中添加一个小的等待,比如1毫秒。我真正想要做的是选择/轮询,直到这两种条件都有效为止,而不仅仅是其中一种,但我不认为select/轮询支持这一点。是否有更好的API可以使用,或者有更好的方法来构造这个循环?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-03 02:20:25

在发现B是不可写的之后再加一个睡眠怎么样?

代码语言:javascript
复制
while (true) {
  select(A readableB, timeout);
  if (A was readable) {
    select(B writeable, 0); // Check if it is writeable right now
    if (B was writeable) {
      ReadFromAWriteToB();
    }
    else {
      sleep for an appropriate amount of time
    }
  }
}

这将:

  • 当A准备好而B未准备好时,防止紧环
  • 确保在检查B之前,我们总是对A进行新的检查。

如果在找到A准备好之后,我们可以等待无限的时间,我们可以这样重写循环:

代码语言:javascript
复制
while (true) {
  select(A readableB, timeout);
  if (A was readable) {
    b_timeout = 0
    while true {
      select(B writeable, b_timeout); // Check if it is writeable right now
      if (B was writeable) {
        ReadFromAWriteToB();
        break;
      }
      sleep for a small amount of time to prevent tight loop around B
      b_timeout += a few milli seconds
    }
  }
}

这将

  • 像前面的解决方案那样防止紧循环。
  • 在找到A准备好之后,减少检查A的次数

希望这是有意义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42015120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档