我有一个有图书馆的设备.它的一些功能最令人敬畏,在"偶尔挂起"的意义上.
我有一个使用此设备的程序.如果/何时挂起,我需要能够优雅地恢复并重置它.有问题的调用应该在几毫秒内返回,并且每秒循环调用很多次.
我的第一个问题是:当运行顽抗函数的线程挂起时,我该怎么办?即使我用中断点乱丢线程,也会发生这种情况:
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::futurefuture = 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::asio
用thread_group
一些运行的工作线程的io_service::run()
.它非常有效,直到第二次超时.然后我的线程用完了,因为每个挂线都吃掉了我的一个,thread_group
它永远不会回来.
我最近的想法是打电话work_threads.create_thread
来创建一个新线程来取代现在悬挂的线程.所以我的第二个问题是:如果这是一个可行的方法来解决这个问题,我应该如何应对缓慢积累的一组鸿线?我该如何删除它们?把它们留在那里可以吗?
顺便提一下,我应该提一下,实际上有一个版本的deviceLibrary.thatFunction()
超时.它没有.
我找到了这个答案,但它是C#和Windows特定的,这个似乎是相关的.但我不太确定每秒产生数百个额外的进程 (编辑:哦,对了;我可以放弃一个或两个单独进程的所有调用.如果他们通信得很好,我可以在他们之间共享设备.嗯...)
相关背景信息:我在Windows 7上使用MSVC 2013,但代码必须在Debian上使用GCC 4.6进行ARM交叉编译.我的C++知识水平是......好吧......如果看起来我错过了一些明显的东西,我可能就是这样.
谢谢!