我有一个boost::thread,它对boost::asio::serial_port执行同步读取。当我销毁包含两者的类的实例时,即使线程在读取调用中被阻塞,我也希望线程正常结束。我怎样才能做到这一点?

查看docs,我尝试了cancel,但它仅适用于异步读取/写入。然后我尝试了close,但是出现了异常,这不是您可以从中恢复的那种。也许使用send_breaknative_handle? (这是Windows,可移植性并不重要)

更新:我还尝试了对传递给串行端口对象的构造函数的stop进行io_service,但并未对read进行解锁。

编辑:异常实际上是“可捕获的”,但是我不愿意在析构函数中放入try/catch块,并且重构代码以在析构函数之外执行关闭过程会触发上层的大量更改。因此,只有某些Boost授权机构说别无他法时,我才会采用该解决方案。

最佳答案

您无法按照您的要求取消阻止同步读取。

有两种选择:

  • close/shutdown端口并捕获异常,这是由
  • 引发的
    当您关闭应用程序时,
  • 使用异步读取并对它们进行cancel编码

    当然,第一个不是一个好主意,因为您无法将终止的应用程序与错误区分开。

    关于c++ - 在boost::asio::serial_port上取消阻止同步读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9200005/

  • 10-11 22:40
    查看更多