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

时间:2018-10-19 07:27:35

标签: c++ function call exit infinite

我为带有读取功能的串行链接创建了一个类。 我使用boost :: asio :: 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 
}

3 个答案:

答案 0 :(得分:1)

  

是否可以从另一个函数G中退出C ++中的函数F?

否,但是您可以考虑在G主体(从F中调用)throwing中的一些exception(和catching在同一线程中的F中的异常)

  

或取消读取函数调用

这是特定于操作系统的。在Linux上,您可以使用non-blocking IO(并使用poll(2)来检测何时有可用的输入,例如在event loop中)。您也可以使用异步IO。参见aio_read(3)aio_cancel(3)

答案 1 :(得分:1)

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

在所需的橄榄石之后,您取消了读取线程(pthread_cancel(thread_read);

答案 2 :(得分:1)

如果 port_是普通文件描述符 ,并且您拥有POSIX,则可以先调用selectpoll它(后者更易于使用),都提供了超时功能。

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