我在same situation as this guy中,但是我不太明白答案。

问题:

  • 线程1在正在阻塞的套接字上调用accept
  • 线程2在此套接字上调用close
  • 线程1继续阻塞。我希望它从接受返回。

  • 解决方案:



    我不知道该怎么做-在线程1中接收到信号后,accept已经被阻塞,并且在信号处理程序完成后将继续阻塞。
  • 答案的真正含义是什么?
  • 如果线程1的信号处理程序可以执行某些操作,从而导致accept立即返回,为什么线程2在没有信号的情况下也不能执行相同操作?
  • 是否有另一种方法可以不发出信号?我不想增加图书馆的警告。
  • 最佳答案

    而不是阻塞 accept() ,而不是阻塞 select() poll() 或类似的调用之一,它允许您等待多个文件描述符上的 Activity 并使用“自管技巧”。传递给select()的所有文件描述符都应处于非阻塞模式。文件描述符之一应该是与accept()一起使用的服务器套接字;如果该代码变得可读,则应继续调用accept(),它将不会阻塞。除此以外,创建一个 pipe() ,将其设置为非阻塞,然后检查读取面是否可读。不必在另一个线程的服务器套接字上调用close(),而是将数据字节发送到管道写端的第一个线程。实际的字节值无关紧要;目的仅仅是唤醒第一个线程。当select()指示管道可读时,read()并忽略管道中的数据,close()服务器套接字,并停止等待新连接。

    07-24 09:45
    查看更多