我知道这不是说出问题的最佳方式。在我的服务器中,一些问题基本上归结为此 - 一旦遇到conditionA,你如何从while循环中断?如果满足conditionB,是否可以销毁特定的线程?
不幸的是,主线程被recvfrom()函数永远阻塞,除非我可以从循环中断开。
while (1)
{
recBytes = recvfrom(sock, packetBuff, 8, 0, (struct sockaddr *) &client, &SockLength);
std::thread TX([&]
{
//process packet task
if(conditionA == 1)
break from while loop
if(conditionB == 1)
destroy any active threads spawned by TX
.
.
.
much more tasks
});
TX.detach();
}
.
.
.
continue rest of code
提前致谢!
答案 0 :(得分:1)
从阻塞I / O调用中断的标准方法是将其替换为等待2个套接字的select()/ poll()/ etc:数据套接字和非阻塞通知管道。如果select()报告您可以读取或写入数据套接字,那么就可以以非阻塞方式执行此操作。如果报告数据在通知管道上可用,则会从循环中断开。任何线程都可以将单个字节写入非阻塞通知管道,以使另一个线程中的select()返回。
至于破坏其他线程,如果没有这些线程的合作,你就无法做到这一点。基本上,您需要一种方法来通知他们需要退出。如果这些线程没有阻塞调用,那么带有定期检查的简单原子标志就可以了。否则,您需要一种方法来阻止阻塞调用。如果是I / O呼叫,请引入另一个通知管道。如果它在条件变量上阻塞,请使用std :: condition_variable :: notify_all()。