C++ 从另一个函数退出函数

C++ exit function from another function

我已经为连载 link 创建了一个 class 具有读取功能。 我使用 boost::asio::read 从串口 link 读取数据。但是读取函数会无限等待直到接收到一个字节。

我想创建一个线程,在超过最大等待时间后停止读取功能(因为系统似乎出现故障)。

是否可以从另一个函数退出 C++ 中的一个函数?或者取消从其他函数调用读取函数?

std::string SerialLink::read(const int maxTime) {
  std::string data;
  std::vector < uint8_t > buf;
  const int readSize = 1;
  try {
    buf.resize(readSize);

    //boost::asio::read waits until a byte has been received
    boost::asio::read(port_, boost::asio::buffer(buf, readSize));
    data = buf.front();
  } 
catch (const std::exception & e) {
    std::cerr << "SerialLink ERROR: " << e.what() << "\n";
    return -1;
  }
  return data();
}

void threadTime() {
  //This function will keep track of the time and if maxTime has passed, the read function/function call must be cancelled and return -1 if possible 
}

Is it possible to exit a function F in C++ from another function G?

不,但您可以考虑在 G 的主体中(从 F 调用)throwing some exception (and catching F 中的异常,在同一线程内)

Or cancel the read function call

这是特定于操作系统的。在 Linux 上,您可以使用 non-blocking IO (and use poll(2) to detect when input is available, e.g. in your event loop). You could also use asynchronous IO. See aio_read(3) and aio_cancel(3).

如何在一个线程中阅读 (pthread_t thread_read;),然后在另一个线程中启动计时器 (pthread_t thread_timer;)。

在期望的周期后,您取消阅读线程 (pthread_cancel(thread_read);)

如果 port_是一个普通的文件描述符并且你有可用的POSIX,你可能首先调用 select or poll 它(后者更容易使用),两者都提供超时功能。

设备和 OS 具体(您必须阅读文档),ioctl 甚至可能允许您获取 多少 可用数据。 ..