gpt4 book ai didi

C++:如何异步调用同步库调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:43 24 4
gpt4 key购买 nike

我正在使用一个库,它有一个阻塞调用,如果它不成功,它永远不会超时。我希望能够更优雅地处理这种错误情况。我知道必须有一种方法可以将调用包装在工作线程(或其他类型的委托(delegate)对象)中,等待 x 秒,然后如果 x 秒已经过去则抛出异常。我只需要为库中的一个函数执行此操作。我该如何着手实现呢?我在网上看到了类似的例子,但没有一个是在做我想做的事情。谢谢!

最佳答案

我的回答是“不要尝试这样做”。

当然,您可能会找到一些似乎对您的特定情况有效的 hack。但是这里的竞争条件很难解决。

显而易见的方法是让线程 A 进行阻塞调用,然后设置线程 B 以在超时到期时终止 A

但是...如果超时在 A 从阻塞调用返回的同时到期怎么办?具体来说,如果 B 认为 是时候终止 A,那么您的操作系统调度程序决定运行 A一段时间后,您的操作系统决定运行杀死 AB 代码?

底线:您最终会在 A 执行过程中的某个不确定点杀死它。 (例如,它可能只是从储蓄账户中扣除了 500 美元,但还没有向支票账户中添加 500 美元。可能性是无穷无尽的……)

好的,所以你可以让线程 A 存在的唯一目的是运行库调用,然后在它完成时发出条件信号或其他任何信号。至少原则上可以使这项工作成为可能。但即便如此,如果库本身有一些内部状态处于不一致状态,如果 A 在不合时宜的时刻被杀死怎么办?

C++11 标准省略异步线程取消是有充分理由的。拒绝吧。修复库例程。无论成本如何,从长远来看,它几乎肯定比您正在尝试的要便宜。

关于C++:如何异步调用同步库调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9790603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com