在c ++中,“recvfrom”函数是一个阻塞函数(阻塞线程直到数据包到达)。
如何安全地终止在“recvfrom”中阻止的线程?
答案 0 :(得分:2)
一旦select / poll / epoll成功返回,只需调用recvfrom
即可避免这种情况。
就像评论中提到的@Remy Lebeau一样,你可以提供如下内容:
while(run_flag) {
if(check select/poll/epoll) {
recvfrom(..)
}
}
您可以在这里开始使用epoll和select。互联网上也有很多。
另一种方法是使用异步网络操作而不是线程。
我可能还建议使用boost::asio因为这只是你所有的网络内容。
答案 1 :(得分:2)
使用“自我管道”技巧。
使用pipe(2)系统调用打开管道。使用select / poll / kqueue /从你关心的套接字和管道中读取任何内容。当您从套接字获取数据时,请按照正常情况处理它。
要停止线程,请关闭要停止处理的线程中管道的另一端。您将在管道上将其检测为EOF,然后您可以将其用作停止线程处理实际套接字的信号。