我有boost::thread
对boost::asio::serial_port
执行同步读取。当我销毁包含两者的类的实例时,我希望线程优雅地结束,即使它在读取调用中被阻止。我怎么能这样做?
查看docs,我尝试cancel
,但它仅适用于异步读/写。然后我尝试了close
,但我得到了一个例外,它不是你可以恢复的那种。也许使用send_break
或native_handle
? (这是Windows和便携性并不重要)
更新:我还尝试stop
io_service
我传递给串口对象的构造函数,但read
未被解除阻止。
编辑:异常实际上是“可捕获的”,但是我讨厌在析构函数中放置一个try / catch块,并且重构代码以在析构函数之外执行关闭过程会触发上层有很多变化。因此,如果某个Boost权威人士说没有别的办法,我只会选择这个解决方案。
答案 0 :(得分:5)
无法按要求取消阻止同步读取。
有两种选择:
close
/ shutdown
端口并捕获异常,该异常已被提出cancel
第一个当然不是一个好主意,因为你无法区分终止应用程序和错误。
答案 1 :(得分:1)
在结束时,你说你得到的例外情况“不是你可以从中恢复的那种。”
这是什么意思?
解决方案似乎是要抓住异常。你为什么不能这样做?
对于想要区分错误和程序终止的情况,请在关闭前在程序终止时设置一个标志。在异常处理程序(catch)中检查标志。如果设置,则处理为程序终止,否则处理为错误。
您说您不希望在析构函数中放置try / catch块。这对我来说似乎是一种奇怪的偏见,但还有其他方法。
您可以允许异常一直传播到围绕所有代码的最顶层catch块,并在那里处理它。 (当然,你确实有这样的try / catch块保护你的整个应用程序: - )
其他方式也是可能的......但老板刚刚放弃了