如何从socket c ++中终止线程读取?

时间:2013-03-04 19:30:31

标签: c++ multithreading sockets

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

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

2 个答案:

答案 0 :(得分:2)

一旦select / poll / epoll成功返回,只需调用recvfrom即可避免这种情况。

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

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

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

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

我可能还建议使用boost::asio因为这只是你所有的网络内容。

答案 1 :(得分:2)

使用“自我管道”技巧。

使用pipe(2)系统调用打开管道。使用select / poll / kqueue /从你关心的套接字和管道中读取任何内容。当您从套接字获取数据时,请按照正常情况处理它。

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