我们的教授在课堂上给了我们这个代码:
st = select(max+1, &rs, NULL, NULL, &timeinterval);
if(st){
for(int i=0; i<workers; i++)
{
if(FD_ISSET(channels[i]->read_fd(), &rs))
老实说,我很难理解它在做什么。我尝试研究更多有关 pthreads 的信息,但似乎没有任何内容可以解释它的作用。他说这与文件描述符有关,但我不明白这段代码是如何发生的。
这个
select
的目的是等待多个文件描述符,可能会超时,当它返回一个正数时,这意味着rs
集中至少有一个fd准备好读取,这样在一个循环,检查它是哪个 fd,并对其执行读取。
注意,您应该检查大于 0 的值,因为如果出现错误,将返回 -1,您不应该检查 fd_set 而是处理错误:
if(st > 0) {
for(int i=0; i<workers; i++)
{
if(FD_ISSET(channels[i]->read_fd(), &rs)) {
// perform read on channels[i]->read_fd
}
}
} else if (st == 0) {
// handle time out
} else {
// handle error
}
我使用选择功能为短定时器创建延迟。我想知道 usleep(x) 或 sleep(x) 是否比这个更好,尽管这可能更精确:
void delay(double time)
{
if ( time<0.000001)
{
return;
}
int uSec =static_cast<int>(time*1000.0f);
struct timeval tv;
tv.tv_usec =(__suseconds_t)uSec;
tv.tv_sec = (time_t)(uSec / 1000000);
select(0, NULL, NULL, NULL, &tv);
}