我需要等待从文件描述符A读取的东西,然后只有当文件描述符B可写时才读取它。我的第一个实现是这样的(伪代码):
while (true) {
select(A readable, B writeable, timeout)
if (A was readable and B was writeable) {
ReadFromAWriteToB();
}
}这就产生了这样的问题,即select在出现其中一个条件时返回。这是一个问题,因为A是可读的,有10%的时间是可读的,但是B是可写的,90%的时间是可以写的,所以它会醒来给B写,即使我们通常没有从A读取的任何数据。
我的下一个实现如下:
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可以使用,或者有更好的方法来构造这个循环?
发布于 2017-02-03 02:20:25
在发现B是不可写的之后再加一个睡眠怎么样?
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准备好之后,我们可以等待无限的时间,我们可以这样重写循环:
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
}
}
}这将
希望这是有意义的。
https://stackoverflow.com/questions/42015120
复制相似问题