Waiting for interrupt-loop

Waiting for interrupt-loop

本文关键字:interrupt-loop for Waiting      更新时间:2023-10-16

我需要为我的项目等待一段时间的代码结构,但是当有中断时(例如传入udp数据包)它离开这个循环,做一些事情,并在此之后重新开始等待。
我该如何实现呢?我的第一个想法是使用while(wait(2000)),但等待是一个无效的结构…
谢谢你!

我会将循环放入函数

void awesomeFunction() {
    bool loop = true;
    while (loop) {
        wait(2000);
        ...
        ...
        if (conditionMet)
            loop = false;
    }
}

然后我将把这个函数放入另一个循环

while (programRunning) {
    awesomeFunction();
    /* Loop ended, do stuff... */
}

从这个问题中有几件事我不清楚。这是一个多线程应用程序,其中一个线程处理(例如)UDP数据包,而另一个线程等待事件,或者这是单线程的?你也没有提到这是什么操作系统,这是相关的。因此,我将假设Linux,或支持轮询API的东西,或类似的东西(如select)。

让我们假设一个等待UDP数据包的单线程应用程序。主要思想是,一旦你有了套接字的文件描述符,你就有了对poll调用的无限循环。例如:
#include <poll.h>
// ...
void handle_packets() {
  // m_fd was created with `socket` and `bind` or `connect`.
  struct pollfd pfd = {.fd = m_fd, .events = POLLIN};
  int timeout;
  timeout = -1; // Wait indefinitely
  // timeout = 2000; // Wait for 2 seconds
  while (true) {
    pfd.revents = 0;
    poll(&pfd, 1, timeout);
    if ((pfd.revents & POLLIN) != 0) {
      handle_single_packet();  // Method to actually read and handle the packet
    }
    if ((pfd.revents & (POLLERR | POLLHUP)) != 0) {
      break; // return on error or hangup
    }
  }
}

select的一个简单例子可以在这里找到。


如果您正在查看一个多线程应用程序,试图在两个线程之间进行通信,那么有几个选项。其中两个是:

  1. 使用与上面相同的机制。文件描述符是调用pipe的结果。正在睡觉的线程获得管道的读端。正在唤醒的线程得到写端,并在该唤醒时写入一个字符。

  2. 使用c++的std::condition_variable。这里记录了它,并提供了一个完整的示例。这个解决方案取决于你的上下文,例如,你是否有一个可以等待的变量,或者你必须做什么。

其他中断也可以用这种方式捕获。例如,信号有一个signalfd。定时器事件有timerfd。这在很大程度上取决于您需要什么,以及在什么环境中运行。例如,timerfd是linux特有的。