【问题标题】:C++ exit function from another functionC++ 从另一个函数退出函数
【发布时间】:2019-03-24 01:35:11
【问题描述】:

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

【问题讨论】:

    标签: c++ function call exit infinite


    【解决方案1】:

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

    在所需的periob之后,您取消阅读线程(pthread_cancel(thread_read);

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 很好,但特定于 POSIX。我猜想select 在 WinAPI 上本身不可用。
      • @BasileStarynkevitch 说实话,应该提到...select 在 WinAPI 中可用,但仅适用于套接字...
      【解决方案3】:

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

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

      或者取消读取函数调用

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

      【讨论】:

      • 在我的情况下抛出异常不起作用,因为函数 G 是一个线程函数。并且从线程抛出异常会终止程序。我没有事件循环,因为 boost::asio::read() 是“挂起”的函数。而且我不想改变 boost::asio::read() 函数。
      • 你可以在抛出异常的线程中捕获异常
      • 是的,但这不是问题的解决方案,因为您仍然必须从 G 函数中终止 F 函数。
      • 实际上,你可能需要一个事件循环(所以在 Linux 上使用poll
      猜你喜欢
      • 2018-12-19
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2020-06-12
      • 2023-03-28
      相关资源
      最近更新 更多