如何在C++中的线程中正确处理永久挂起的第三方库调用?

 驺虞是白虎 发布于 2022-12-21 15:17

我有一个有图书馆的设备.它的一些功能最令人敬畏,在"偶尔挂起"的意义上.

我有一个使用此设备的程序.如果/何时挂起,我需要能够优雅地恢复并重置它.有问题的调用应该在几毫秒内返回,并且每秒循环调用很多次.

我的第一个问题是:当运行顽抗函数的线程挂起时,我该怎么办?即使我用中断点乱丢线程,也会发生这种情况:

boost::this_thread::interruption_point(); // irrelevant, in the past
deviceLibrary.thatFunction(); // <-- hangs here forever
boost::this_thread::interruption_point(); // never gets here!

我在这里读到的唯一一个词是修改功能本身,但出于各种原因这是不可能的 - 尤其是"这已经超出了我的技能范围".

我尝试过用C++ 11期货进行异步启动:

// this was in a looping thread -- it does not work: wait_for sometimes never returns
std::future future = std::async(std::launch::async, 
    [this] () { deviceLibrary.thatFunction(*data_ptr); }); 
if (future.wait_for(std::chrono::seconds(timeout)) == std::future_status::timeout) { 
    printf("no one will ever read this\n"); 
    deviceLibrary.reset(); // this would work if it ever got here
}

没有骰子,在那个或多个变化.

我现在想boost::asiothread_group一些运行的工作线程的io_service::run().它非常有效,直到第二次超时.然后我的线程用完了,因为每个挂线都吃掉了我的一个,thread_group它永远不会回来.

我最近的想法是打电话work_threads.create_thread来创建一个新线程来取代现在悬挂的线程.所以我的第二个问题是:如果这是一个可行的方法来解决这个问题,我应该如何应对缓慢积累的一组鸿线?我该如何删除它们?把它们留在那里可以吗?

顺便提一下,我应该提一下,实际上有一个版本的deviceLibrary.thatFunction()超时.它没有.

我找到了这个答案,但它是C#和Windows特定的,这个似乎是相关的.但我不太确定每秒产生数百个额外的进程 (编辑:哦,对了;我可以放弃一个或两个单独进程的所有调用.如果他们通信得很好,我可以在他们之间共享设备.嗯...)

相关背景信息:我在Windows 7上使用MSVC 2013,但代码必须在Debian上使用GCC 4.6进行ARM交叉编译.我的C++知识水平是......好吧......如果看起来我错过了一些明显的东西,我可能就是这样.

谢谢!

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有