【问题标题】:select() VS "manual polling" on non-blocking socket非阻塞套接字上的 select() VS“手动轮询”
【发布时间】:2015-05-23 08:05:40
【问题描述】:

我有一个用于写入操作(发送)的非阻塞套接字。

我想知道 select() 是否是检测以下情况的唯一方法: - 当连接返回 EINPROGRESS 时,套接字连接成功完成 - 发送返回 EWOULDBLOCK 或 EGAIN 时用于写入操作的套接字的可用性

轮询是 select() 的替代方法吗?在我的应用程序中,我已经有一个线程每 1 秒唤醒一次,它可以循环检查 connect() 是否返回 0(连接正常),如果必须发送一些字节,则发送返回 0(发送正常)。

【问题讨论】:

    标签: sockets network-programming


    【解决方案1】:

    轮询是 select() 的替代方法吗?

    这是另一种选择,但不是一个好选择。你不知道要睡多久。 select() 确实如此。平均而言,手动轮询每次尝试必须休眠两倍所需的时间,并在循环直到成功之前浪费 CPU 周期。 select() 没有任何这些问题。

    【讨论】:

    • 感谢您的有用回答。幸运的是,如上所述,在我的应用程序中,我已经有一个“投票线程”来做一些事情。虽然(你是对的)它会浪费 CPU 周期,但我可以添加如下内容:code 而(某些条件为真)做一些事情;调用连接;如果连接不返回零计数失败;睡眠(1);结束而同时(某些条件为真)做一些事情;呼叫发送;如果 send 不返回零计数失败;睡眠(1);在code 结束
    • 显然在前面的评论中,如果我达到阈值失败,我将退出线程循环。
    猜你喜欢
    • 2010-10-31
    • 2011-03-22
    • 2018-09-20
    • 2010-10-29
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多