Mec*_*eer 4 c++ multithreading future boost-asio c++11
我有一个有图书馆的设备.它的一些功能最令人敬畏,在"偶尔挂起"的意义上.
我有一个使用此设备的程序.如果/何时挂起,我需要能够优雅地恢复并重置它.有问题的调用应该在几毫秒内返回,并且每秒循环调用很多次.
我的第一个问题是:当运行顽抗函数的线程挂起时,我该怎么办?即使我用中断点乱丢线程,也会发生这种情况:
boost::this_thread::interruption_point(); // irrelevant, in the past
deviceLibrary.thatFunction(); // <-- hangs here forever
boost::this_thread::interruption_point(); // never gets here!
Run Code Online (Sandbox Code Playgroud)
我在这里读到的唯一一个词是修改功能本身,但出于各种原因这是不可能的 - 尤其是"这已经超出了我的技能范围".
我尝试过用C++ 11期货进行异步启动:
// this was in a looping thread -- it does not work: wait_for sometimes never returns
std::future<void> 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
}
Run Code Online (Sandbox Code Playgroud)
没有骰子,在那个或多个变化.
我现在想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++知识水平是......好吧......如果看起来我错过了一些明显的东西,我可能就是这样.
谢谢!
如果您想要可靠地杀死一些不受控制并可能挂起的东西,请使用单独的过程.
虽然过程隔离一度被认为是非常"严厉",但今天Chrome这样的浏览器将基于每个标签实现它.每个选项卡都有一个进程,GUI有一个进程,如果选项卡渲染消失,它不会占用整个浏览器.
Google Chrome如何在单个应用程序中将标签隔离到单独的进程中?
线程根本不是为让代码库保护自己免受不良行为库而设计的.流程是.
所以定义你所需要的服务,把所有在一个程序中使用片状库,并使用从主应用程序间通信的桥梁说话.如果桥由于剥落而超时或出现问题,请将其杀死并重新启动.