Multithreading 如何使用活动线程中断while循环

Multithreading 如何使用活动线程中断while循环,multithreading,c++11,lambda,break,Multithreading,C++11,Lambda,Break,我知道这不是回答我问题的最好方式。在我的服务器中,一些问题基本上归结为这个问题- 一旦满足条件A,如何中断while循环?如果满足条件B,是否可能销毁特定线程 不幸的是,主线程永远被recvfrom()函数阻塞,除非我可以中断循环 while (1) { recBytes = recvfrom(sock, packetBuff, 8, 0, (struct sockaddr *) &client, &SockLength); std::thread TX([&]

我知道这不是回答我问题的最好方式。在我的服务器中,一些问题基本上归结为这个问题- 一旦满足条件A,如何中断while循环?如果满足条件B,是否可能销毁特定线程

不幸的是,主线程永远被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

提前谢谢

中断阻塞I/O调用的标准方法是将其替换为select()/poll()/etc,它等待两个套接字:数据套接字和非阻塞通知管道。如果select()报告您可以读取或写入数据套接字,则可以以非阻塞方式执行此操作。如果报告数据在通知管道上可用,则中断循环。任何线程都可以向非阻塞通知管道写入一个字节,以使另一个线程中的select()返回


至于销毁其他线程,如果没有这些线程的合作,就无法做到这一点。基本上,你需要一种方法来通知他们需要退出。如果这些线程不执行阻塞调用,那么一个带有定期检查的简单原子标志就可以了。否则,您需要一种从阻塞调用中断的方法。如果是I/O调用,则引入另一个通知管道。如果阻塞了条件变量,请使用std::condition\u variable::notify\u all()。

您考虑过使用asio库吗?我想到boost.asio,但也有其他可用的库。即使在上述情况下,从另一个线程关闭套接字非常简单有效,可以从recv_退出,并检查错误情况,我希望您已经这样做了。一个中断语句将退出循环。我可以建议YT上的这个讲座:“时间的历史:异步C++ + Steven Simpson”?使用现代C++技术设计客户机/服务器应用程序是非常值得的。不管你的应用程序的大小是多少。@MichaëlRoy你介意用代码告诉我这是什么样子吗?请检查boost.asio代码示例:。请注意,在单个线程上运行时,服务器可以处理多个客户端。上面演示文稿中的代码:。其中一些代码在单个线程上运行时可以同时处理50+k个请求,这总是很有趣的?这将有效地杀死你的守护进程。请检查boost.asio代码示例:@Tulon你介意在代码中向我展示这将是什么样子吗?我不能使用第三方libraries@djent我在原则上解释了它是如何实现的,但实现它取决于您。