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