0

在 C++ 中,“recvfrom”函数是一个阻塞函数(阻塞线程直到数据包到达)。

如何安全地终止在“recvfrom”中阻塞的线程?

4

2 回答 2

2

recvfrom只有在 select/poll/epoll 成功返回后才调用来避免这种情况。

就像评论中提到的@Remy Lebeau 一样,您可以提取如下内容:

while(run_flag) {
    if(check select/poll/epoll) {
         recvfrom(..)
    }
}

您可以在此处开始使用epollselect。互联网上也有很多。

另一种方法是使用异步网络操作而不是线程。

我也可能会推荐使用boost::asio,因为这将只是你所有的网络东西。

于 2013-03-04T19:38:05.127 回答
2

使用“自我管道”技巧。

使用 pipe(2) 系统调用打开管道。使用 select/poll/kqueue/从您关心的套接字和管道读取的任何内容坐在一个循环中。当您从套接字获取数据时,请像往常一样处理它。

要停止线程,请关闭要停止处理的线程中管道的另一端。您将在管道上将其检测为 EOF,然后您可以将其用作停止线程处理真实套接字的信号。

于 2013-03-04T22:22:51.707 回答