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

标签 c++ multithreading asynchronous

我正在使用一个库,它有一个阻塞调用,如果它不成功,它永远不会超时。我希望能够更优雅地处理这种错误情况。我知道必须有一种方法可以将调用包装在工作线程(或其他类型的委托(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/

相关文章:

c++ - OpenCL/C++ - 返回一个 cl::Buffer 对象

c++ - 从 MRI 2D 多切片的 DICOM header 中读取切片数

java - 我可以在 UI 线程以外的线程中杀死或完成()一个 Activity 吗?

javascript - sleep 功能没有解决传递给它的 promise

python - 为什么 gevent.spawn 在调用 Greenlet.join 之前不执行参数化函数?

c# - 异步进程启动并等待它完成

c++ - 从另一个模型中提取子模型?

c++ - 迭代器实现

python - 发生异常时停止线程

java - Android:WAITING()主线程,而对话框在单独的线程中输入