据称 std::thread 导致不可用的堆栈跟踪
Posted
技术标签:
【中文标题】据称 std::thread 导致不可用的堆栈跟踪【英文标题】:std::thread supposedly leading to unusable stack trace 【发布时间】:2018-08-16 08:34:20 【问题描述】:这个问题与std::thread
的所谓劣势有关。昨天我正在随便遍历 Lyft 流行的开源分布式代理 envoy。当我研究他们的线程部分时,我遇到了一条引起我注意的评论。 comment 表示如下:
pthread 线程的包装器。我们不使用 std::thread 因为它吃异常并导致不可用的堆栈跟踪
我不确定 吃异常和不可用的堆栈跟踪是什么意思。
谁能解释它的含义以及为什么std::thread
会导致不可靠的堆栈跟踪?
【问题讨论】:
【参考方案1】:大概他们有一些自定义的异常处理机制,用堆栈跟踪记录未捕获的异常。
std::thread
被定义为捕获未处理的异常并调用 std::terminate:
如果通过抛出异常终止,则调用 std::terminate
https://en.cppreference.com/w/cpp/thread/thread
【讨论】:
【参考方案2】:C++ 标准对 std::threads 中未捕获的异常有如下说明:
In [thread.thread.constr]:
... 如果调用 INVOKE(DECAY_COPY(std::forward(f)), DECAY_COPY(std::forward(args))...) 以 未捕获的异常,应调用终止。
据此,答案
谁能解释它的含义以及为什么
std::thread
会导致不可靠的堆栈跟踪?
除非在线程 proc 本身中以专用方式处理,否则线程只会在异常时终止,并且启动线程的代码堆栈不会更明智地了解所发生的事情。
【讨论】:
以上是关于据称 std::thread 导致不可用的堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章