【发布时间】:2021-03-10 01:31:03
【问题描述】:
当一个类负责管理一个线程时,一个常见的模式 (see for example here) 在你确定线程将及时完成后在析构函数中加入这个线程。然而,这并不总是微不足道的,正如链接线程中所概述的那样,如果执行不正确,程序将永远不会终止。下面给出了一个重现这种情况的例子:
#include <iostream>
#include <thread>
#include <chrono>
using namespace std::chrono_literals;
class Foo {
public:
Foo() {
mythread = std::thread([&](){
int i = 0;
while(running) {
std::cout << "hi" << std::endl;
if (i++ >= 2) {
// placeholder for e.g. a blocking condition variable
std::this_thread::sleep_for(1000h);
}
std::this_thread::sleep_for(500ms);
}
});
}
~Foo() {
running = false;
mythread.join();
}
private:
std::thread mythread;
bool running{true};
};
int main() {
Foo bar;
std::this_thread::sleep_for(1s);
// enabling this line will block the termination
//std::this_thread::sleep_for(2s);
std::cout << "ending" << std::endl;
}
我正在寻找的是一种解决方案,如果发生这种情况,它会强制终止程序。当然,人们应该始终努力正确地完成线程,但拥有这样的功能将作为最后的手段来让内心平静,特别是对于无法观察到的嵌入式系统,崩溃程序比阻塞程序更容易恢复和调试。
一个粗略的解决方案草案是在主线程的末尾启动一个线程,该线程会休眠几秒钟,如果程序在那之后还没有结束,则调用 std::terminate(理想情况下会报告相应的错误) )。然而,我们有一个先有鸡还是先有蛋的问题,因为这个新线程当然会阻止程序及时结束。我将非常感谢任何想法。
编辑: 该解决方案不应要求修改 Foo 类本身,以便它还涵盖未修改代码中的相应错误,例如外部库。理想情况下,它甚至会涵盖没有类认为负责在主结束之前结束它们的线程(具有静态存储持续时间的类,甚至不再引用具有动态存储持续时间的对象),但如果没有深入的操作系统黑客攻击,这可能根本不可能或外部进程监视器。
【问题讨论】:
标签: c++ multithreading