【问题标题】:What is the purpose of pthread and the select () function?pthread 和 select() 函数的目的是什么?
【发布时间】:2016-08-11 00:53:04
【问题描述】:

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

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 与 pthread 没有内在关联。因此,如果没有更多上下文,不清楚您的教授指的是什么,因此不清楚您在问什么。如果您想知道select 的作用,那么可以从select man page 开始。
  • 他在教我们使用单个事件处理线程来管理与服务器进行数据通信的所有通道。他希望我们了解事件处理程序并减少线程管理开销,而不是使用工作线程来处理一对一的请求。也谢谢你的链接!我只需要帮助理解这段代码到底在做什么
  • 那么手册页呢?阅读有帮助吗?如果没有,你不明白哪一部分?总之,select 允许您查看多个文件描述符以查找已定义的事件。当这些事件中的任何一个发生时(例如,其中一个 fd 上的输入可用),则 select 将解除阻塞,并且可以检查 fd 集以查看哪个 fd 有事件。
  • 我了解 select 函数的作用,但文件描述符与处理与服务器之间的数据请求有什么关系呢?我想这应该是我的第一个问题。
  • 好吧,wikipedia 告诉我们 fd 是:“用于访问文件或其他输入/输出资源的抽象指示符(句柄)”。在您的情况下,I/O 资源是往返于服务器的数据通道。因此,通过监视 fd,您可以知道何时可以从特定服务器获得数据。

标签: c linux unix select pthreads


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2012-01-14
    • 2013-05-22
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多