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

gcuhipw9  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(100)

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

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的东西,但似乎没有任何东西可以解释它在做什么。他说这与文件描述符有关,但我不明白这是如何在这段代码中出现的。

soat7uwm

soat7uwm1#

这个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
}
4zcjmb1e

4zcjmb1e2#

我使用select函数来创建一个短定时器的延迟。我想知道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);
}

相关问题