该问题与std::thread
的所谓劣势有关。昨天,我随意浏览了Lyft流行的开源分布式代理envoy。当我研究他们的穿线部分时,我遇到了一条引起我注意的评论。 comment说:
pthread线程的包装器。我们不使用std :: thread,因为它会吃掉异常并导致无法使用的堆栈跟踪
我不确定吃异常和无法使用的堆栈跟踪是什么意思。
有人可以解释它的含义吗,为什么std::thread
导致堆栈记录不可靠?
答案 0 :(得分:5)
大概它们具有一些自定义的异常处理机制,该机制可以通过堆栈跟踪记录未捕获的异常。
std::thread
被定义为捕获未处理的异常并调用std :: terminate:
如果通过引发异常终止,则调用std :: terminate
答案 1 :(得分:1)
C ++标准对std :: threads中未捕获的异常进行了以下说明:
...如果调用了INVOKE(DECAY_COPY(std ::: forward(f)), DECAY_COPY(́std ::: forward(args))...)以 未捕获的异常,终止将被调用。
据此,答案
有人能解释它的含义吗,为什么
std::thread
导致堆栈记录不可靠?
除非在线程proc本身内部以专用方式进行处理,否则该线程将仅在发生异常时终止,并且启动该线程的代码堆栈对于所发生的事情将不那么明智。