我有一个主要用于侦听套接字的线程。我目前在accept()上有线程阻塞。
如何告诉线程完成任何当前事务并停止侦听,而不是在接受时保持阻止?
如果我不需要......我真的不想做非阻塞。
答案 0 :(得分:0)
答案 1 :(得分:0)
基本上你有两种选择,第一种是使用中断:即 http://www.cs.cf.ac.uk/Dave/C/node32.html(参见信号处理程序部分,它还提供了一个th_kill示例)。
从接受手册页:
accept() shall fail if:
EINTR
The system call was interrupted by a signal that was caught before a valid connection arrived.
另一个选择是使用非阻塞套接字和select()
:即:
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzab6%2Frzab6xnonblock.htm
无论如何,通常在多线程服务器中,有一个线程接受新连接并为每个连接产生其他线程。由于accept()ing和recv()ing,可以延迟新的连接请求...(除非你正在使用一个客户端,然后接受()和接收可能没问题)
答案 2 :(得分:0)
在线程上使用pthread_cancel
。您需要确保已安装适当的取消处理程序(pthread_cleanup_push
)以避免资源泄漏,并且除了accept
调用的持续时间之外,您应该禁用取消以避免取消的竞争条件稍后可能会使用与accept
不同的函数执行请求。
请注意,由于glibc实现取消的错误,这种方法可能会导致连接丢失和文件描述符泄漏。这是因为glibc / NPTL不能保证accept
没有完成执行,并且在取消请求被执行之前为新连接分配新的文件描述符。它应该是一个相当罕见的事件,但它仍然是一个需要考虑的问题......
答案 3 :(得分:0)
来自Wake up thread blocked on accept() call
我刚刚使用了shutdown()系统调用,它似乎工作......