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

从另一个函数退出C++函数,c++,function,call,exit,infinite,C++,Function,Call,Exit,Infinite,我已经创建了一个带有读取函数的串行链接类。 我使用boost::asio::read从串行链接读取数据。但是read函数会无限期地等待,直到收到一个字节 我想创建一个线程,如果由于系统出现故障而超过了最大等待时间,那么它将停止读取函数 < >可以从另一个函数中退出C++中的函数吗?或者取消另一个函数的读取函数调用 std::string SerialLink::read(const int maxTime) { std::string data; std::vector < uin

我已经创建了一个带有读取函数的串行链接类。 我使用boost::asio::read从串行链接读取数据。但是read函数会无限期地等待,直到收到一个字节

我想创建一个线程,如果由于系统出现故障而超过了最大等待时间,那么它将停止读取函数

< >可以从另一个函数中退出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 
}

是否可以从另一个函数G?<中退出C++中的函数f?p>

不,但您可以考虑从f中调用的G的主体和在同一线程< /p>中的F中的异常。 或者取消读取函数调用


这是特定于操作系统的。在Linux上,您可以使用和来检测输入何时可用,例如在您的系统中。您还可以使用异步IO。请参阅和。

如何在线程pthread\u t thread\u read;中进行阅读;,然后在另一个线程pthread\u t thread\u timer;中启动计时器

在所需的周期结束后,取消读取线程pthread\u cancelthread\u read

如果port_uu是一个普通的文件描述符,并且您有可用的POSIX,那么您可以首先调用它,或者在它上面调用后者,后者更易于使用,两者都提供了超时功能


特定于设备和操作系统您必须阅读文档,甚至可能允许您获取多少可用数据…

很好,但特定于POSIX。我猜select在WinAPI上本机不可用。@BasileStrynkevitch Truth,应该提到。。。在WinAPI中可用,但仅适用于套接字…在我的情况下引发异常不起作用,因为函数G是线程函数。从线程抛出异常会终止程序。我没有事件循环,因为boost::asio::read是挂起的函数。我不想改变boost::asio::read函数。你可以在抛出它的同一线程中捕获异常是的,但这不是问题的解决方案,因为你仍然需要从G函数终止F函数。实际上,你可能需要一个事件循环,所以在Linux上使用poll