如何从活动线程的while循环中断

时间:2017-06-16 03:52:24

标签: multithreading c++11 lambda break

我知道这不是说出问题的最佳方式。在我的服务器中,一些问题基本上归结为此 - 一旦遇到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

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

至于破坏其他线程,如果没有这些线程的合作,你就无法做到这一点。基本上,您需要一种方法来通知他们需要退出。如果这些线程没有阻塞调用,那么带有定期检查的简单原子标志就可以了。否则,您需要一种方法来阻止阻塞调用。如果是I / O呼叫,请引入另一个通知管道。如果它在条件变量上阻塞,请使用std :: condition_variable :: notify_all()。