std :: thread可能导致无法使用的堆栈跟踪

时间:2018-08-16 08:34:21

标签: c++ multithreading pthreads stdthread

该问题与std::thread的所谓劣势有关。昨天,我随意浏览了Lyft流行的开源分布式代理envoy。当我研究他们的穿线部分时,我遇到了一条引起我注意的评论。 comment说:

  

pthread线程的包装器。我们不使用std :: thread,因为它会吃掉异常并导致无法使用的堆栈跟踪

我不确定吃异常和无法使用的堆栈跟踪是什么意思。

有人可以解释它的含义吗,为什么std::thread导致堆栈记录不可靠?

2 个答案:

答案 0 :(得分:5)

大概它们具有一些自定义的异常处理机制,该机制可以通过堆栈跟踪记录未捕获的异常。

std::thread被定义为捕获未处理的异常并调用std :: terminate:

  

如果通过引发异常终止,则调用std :: terminate

https://en.cppreference.com/w/cpp/thread/thread

答案 1 :(得分:1)

C ++标准对std :: threads中未捕获的异常进行了以下说明:

  

In [thread.thread.constr]

     

...如果调用了INVOKE(DECAY_­COPY(std ::: forward(f)),   DECAY_­COPY(́std ::: forward(args))...)以   未捕获的异常,终止将被调用。

据此,答案

  

有人能解释它的含义吗,为什么std::thread导致堆栈记录不可靠?

除非在线程proc本身内部以专用方式进行处理,否则该线程将仅在发生异常时终止,并且启动该线程的代码堆栈对于所发生的事情将不那么明智。