【发布时间】:2016-05-02 15:12:17
【问题描述】:
我使用recv() 从套接字读取数据并使用fcntl() 设置套接字阻塞/非阻塞。我的问题是:如果我调用recv()(阻塞)并且我从另一个线程调用fcntl()并将套接字设置为非阻塞,那么当前运行的recv()会返回还是fcntl()的效果只会在之后发生阻塞的recv() 返回了,我又调用它了吗?
【问题讨论】:
-
试试看。奇怪的是,您希望一个套接字既是阻塞的又是非阻塞的,并且让另一个线程对状态进行欺骗。在 linux 上,我会在客户端使用 socket() 和服务器上的 accept4() 设置创建套接字时为非阻塞。
-
您是否只是想异步唤醒在
recv调用中阻塞的线程?如果是这样,即使fcntl产生所需的结果,也可能有更好/更安全的方法。例如,使用poll阻塞外部recv套接字或仅用于进程内通知的内部套接字。 -
@BrianMcFarland 这正是我打算做的,但由于它甚至不起作用(根据 EJP 的回答),我会研究你的想法。谢谢!
-
最简单的解决方案是调用
poll(或select或epoll_wait)超时,然后检查由其他线程设置的标志。显然,当您不需要唤醒时,会浪费一些 CPU 周期。除此之外,请尝试使用eventfd、pipe 或socketpair,按照灵活性从低到高的顺序依次是资源开销。