C++11:Mac 上的 Clang 没有捕获 std::thread 函数抛出的异常?

后论坛

我有一个非常简单的程序:

#include <iostream>
#include <string>
#include <thread>
using namespace std;
struct N{
    string s;
    N(){}
    ~N(){cout<<"N dtor"<<endl;}
};

void f(){
    N n;
    throw 0;
}
int main(){
    try{
        thread a(f), b(f);
        a.join();
        b.join();
    }catch(exception& e){
        cout<<e.what()<<endl;
    }
    return 0;
}

在我的mac+clang环境下,运行结果是:

libc++abi.dylib: terminating with uncaught exception of type int
Abort trap: 6

它没有像我预期的那样打印“N dtor”。所以我的问题是,如果 std::thread 函数抛出异常,如何捕获/处理它?不能保证线程函数内的代码不会抛出任何异常。

我在 linux 上试了一下,异常可以被捕获并打印:

Enable multithreading to use std::thread: Operation not permitted

非常感谢。

马克·阿德尔斯伯格

如果在线程中抛出异常,则必须在同一个线程中捕获(或根本不捕获)。在您的示例中,该try块可以专门从创建或加入线程的尝试中捕获异常,但不能捕获由线程中运行的代码引起的异常。

如果你考虑一下,这就是它必须的样子。您的示例试图确保try在线程完成之前您不会离开块,但这通常不能保证。即使在您的示例中,如果join 调用试图抛出源自目标线程的异常(它们不会,但为了论证......),您将永远无法到达join(b)调用,并且没有任何东西可以保证您“tryb的线程抛出异常时,仍然在块中

一个线程捕获另一个异常的流控制根本不起作用。如果您需要这种功能,您可以在工作线程中放置一个异常处理程序,并使用已建立的线程间通信机制将异常状态传送回主线程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++ 11中的std :: thread出口上自动调用函数

来自分类Dev

在MAC上安装Clang

来自分类Dev

错误C2280:'std :: thread :: thread(const std :: thread&)':尝试引用已删除的函数

来自分类Dev

C ++ 11使用std :: thread运行模板化类函数

来自分类Dev

'std :: thread :: thread':没有重载函数需要7个参数

来自分类Dev

C ++ 11线程编译错误,删除了复制构造函数和std :: thread,为什么?

来自分类Dev

无法捕获由std :: thread构造函数引发的异常

来自分类Dev

clang中是否有一组已知的`c ++ 11`功能,默认情况下不需要`-std = c ++ 11`?

来自分类Dev

C ++ 11 std :: thread与Windows CreateThread

来自分类Dev

为什么当“官方” clang支持时,Apple clang不允许C ++ 11 thread_local

来自分类Dev

c ++ 11 std :: thread与类友函数之间的交互

来自分类Dev

如何在Mac OSX clang上获得对thread_local的支持?

来自分类Dev

没有参数的std :: thread构造函数

来自分类Dev

std :: thread ---没有匹配的构造函数

来自分类Dev

抛出异常会导致OSX 10.11.4 + clang上的SIGSEGV

来自分类Dev

有什么理由要在std :: jthread上使用std :: thread?

来自分类Dev

vscode中的C ++:错误:没有匹配的构造函数来初始化'std :: thread'

来自分类Dev

有什么理由要在std :: jthread上使用std :: thread?

来自分类Dev

C ++ 11 std :: thread奇怪的行为

来自分类Dev

C ++ 11使用std :: thread运行模板化类函数

来自分类Dev

C ++ 11:为什么我会收到错误消息:调用std :: thread :: thread没有匹配函数?

来自分类Dev

std :: thread(c ++ 11)中使用的函数可以有[[noreturn]]吗?

来自分类Dev

iOS上的std :: thread

来自分类Dev

C ++ std :: thread应该在堆或堆栈上创建

来自分类Dev

C ++ 11多线程合并排序,错误为“没有构造函数'std :: thread'的实例与参数列表匹配”

来自分类Dev

为什么SIGSEGV的信号处理程序没有捕获我的C ++抛出异常?

来自分类Dev

C ++ 11:具有std :: thread和lambda函数的Segfault

来自分类Dev

C ++ 11 std :: thread std :: move尝试使用已删除的函数

来自分类Dev

线程创建C ++ std :: thread抛出异常

Related 相关文章

  1. 1

    在C ++ 11中的std :: thread出口上自动调用函数

  2. 2

    在MAC上安装Clang

  3. 3

    错误C2280:'std :: thread :: thread(const std :: thread&)':尝试引用已删除的函数

  4. 4

    C ++ 11使用std :: thread运行模板化类函数

  5. 5

    'std :: thread :: thread':没有重载函数需要7个参数

  6. 6

    C ++ 11线程编译错误,删除了复制构造函数和std :: thread,为什么?

  7. 7

    无法捕获由std :: thread构造函数引发的异常

  8. 8

    clang中是否有一组已知的`c ++ 11`功能,默认情况下不需要`-std = c ++ 11`?

  9. 9

    C ++ 11 std :: thread与Windows CreateThread

  10. 10

    为什么当“官方” clang支持时,Apple clang不允许C ++ 11 thread_local

  11. 11

    c ++ 11 std :: thread与类友函数之间的交互

  12. 12

    如何在Mac OSX clang上获得对thread_local的支持?

  13. 13

    没有参数的std :: thread构造函数

  14. 14

    std :: thread ---没有匹配的构造函数

  15. 15

    抛出异常会导致OSX 10.11.4 + clang上的SIGSEGV

  16. 16

    有什么理由要在std :: jthread上使用std :: thread?

  17. 17

    vscode中的C ++:错误:没有匹配的构造函数来初始化'std :: thread'

  18. 18

    有什么理由要在std :: jthread上使用std :: thread?

  19. 19

    C ++ 11 std :: thread奇怪的行为

  20. 20

    C ++ 11使用std :: thread运行模板化类函数

  21. 21

    C ++ 11:为什么我会收到错误消息:调用std :: thread :: thread没有匹配函数?

  22. 22

    std :: thread(c ++ 11)中使用的函数可以有[[noreturn]]吗?

  23. 23

    iOS上的std :: thread

  24. 24

    C ++ std :: thread应该在堆或堆栈上创建

  25. 25

    C ++ 11多线程合并排序,错误为“没有构造函数'std :: thread'的实例与参数列表匹配”

  26. 26

    为什么SIGSEGV的信号处理程序没有捕获我的C ++抛出异常?

  27. 27

    C ++ 11:具有std :: thread和lambda函数的Segfault

  28. 28

    C ++ 11 std :: thread std :: move尝试使用已删除的函数

  29. 29

    线程创建C ++ std :: thread抛出异常

热门标签

归档