我正在使用一个库,它有一个阻塞调用,如果它不成功,它永远不会超时。我希望能够更优雅地处理这种错误情况。我知道必须有一种方法可以将调用包装在工作线程(或其他类型的委托(delegate)对象)中,等待 x 秒,然后如果 x 秒已经过去则抛出异常。我只需要为库中的一个函数执行此操作。我该如何着手实现呢?我在网上看到了类似的例子,但没有一个是在做我想做的事情。谢谢!
最佳答案
我的回答是“不要尝试这样做”。
当然,您可能会找到一些似乎对您的特定情况有效的 hack。但是这里的竞争条件很难解决。
显而易见的方法是让线程 A
进行阻塞调用,然后设置线程 B
以在超时到期时终止 A
。
但是...如果超时在 A
从阻塞调用返回的同时到期怎么办?具体来说,如果 B
认为 是时候终止 A
,那么您的操作系统调度程序决定运行 A
一段时间后,您的操作系统决定运行杀死 A
的 B
代码?
底线:您最终会在 A
执行过程中的某个不确定点杀死它。 (例如,它可能只是从储蓄账户中扣除了 500 美元,但还没有向支票账户中添加 500 美元。可能性是无穷无尽的……)
好的,所以你可以让线程 A
存在的唯一目的是运行库调用,然后在它完成时发出条件信号或其他任何信号。至少原则上可以使这项工作成为可能。但即便如此,如果库本身有一些内部状态处于不一致状态,如果 A
在不合时宜的时刻被杀死怎么办?
C++11 标准省略异步线程取消是有充分理由的。拒绝吧。修复库例程。无论成本如何,从长远来看,它几乎肯定比您正在尝试的要便宜。
关于C++:如何异步调用同步库调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9790603/