pthread和select()函数的用途是什么?

问题描述 投票:0回答:2

我们的教授在课堂上给了我们这个代码:

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 的信息,但似乎没有任何内容可以解释它的作用。他说这与文件描述符有关,但我不明白这段代码是如何发生的。

c linux unix pthreads posix-select
2个回答
4
投票

这个

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
}

0
投票

我使用选择功能为短定时器创建延迟。我想知道 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.