【问题标题】:std::thread supposedly leading to unusable stack trace据称 std::thread 导致不可用的堆栈跟踪
【发布时间】:2018-08-16 08:34:20
【问题描述】:

这个问题与std::thread 的所谓劣势有关。昨天我正在随便遍历 Lyft 流行的开源分布式代理 envoy。当我研究他们的线程部分时,我遇到了一条引起我注意的评论。 comment 表示如下:

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

我不确定 吃异常和不可用的堆栈跟踪是什么意思

谁能解释它的含义以及为什么std::thread 会导致不可靠的堆栈跟踪?

【问题讨论】:

    标签: c++ multithreading pthreads stdthread


    【解决方案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 本身中以专用方式处理,否则线程只会在异常时终止,并且启动线程的代码堆栈不会更明智地了解所发生的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 2021-03-23
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 2011-05-25
        • 2011-05-13
        相关资源
        最近更新 更多