C++,set_terminate是每个线程的本地吗?

osg*_*sgx 11 c++ exception-handling language-lawyer c++11 c++03

应该set_terminate/ get_terminate为C++ 2011或C++ 2003中的多个线程设置不同的终止异常处理器?

例如,如果我有程序并设置终止处理程序func_1; 然后我开始3个线程.什么是新线程中的终止处理程序?如果在每个线程中我将设置终止处理程序到func_2第一个线程,func_3第二个线程等等.

N3242(C++ 2011草案)[handler.functions][support.exception]/ 或中没有说明[exception.terminate]

PS:对于这些标准的任何流行实现,您可以回答C++ 2011或C++ 2003

PPS:有FCD评论... C++ FCD评论状态版本5 N3249(2011):

GB 71    18.6.2.4 / 18.8.2.2 / 18.8.3.2   
Run Code Online (Sandbox Code Playgroud)

的线程安全std::set_new_handler(),std::set_unexpected(),std::set_terminate(),是不确定使得功能不可能一个线程安全的方式使用.

必须指定函数的线程安全保证,并且应提供新接口,以便以线程安全的方式查询和安装处理程序.

LWG 1365 接受修改

见文件 N3189

eca*_*mur 10

17.6.4.7p4说:

调用set_*get_*函数不应导致数据竞争.对任何set_*函数的调用应与对相同set_*函数和相应get_*函数的后续调用同步.

这强烈暗示即使从不同的线程调用,set_*get_*函数也在相同的全局状态下运行.18.8.3下的所有段落都讨论了" 当前的处理函数 ",没有提到线程; 这表明处理函数是程序整体的属性; 同样,17.6.4.7具有:

2 - C++程序可以在执行期间安装不同的处理函数[...]
3 - C++程序可以通过调用以下函数来获取指向当前处理函数的指针[...]

这些段落讨论了程序上下文中的当前处理函数,表明它是程序范围而不是线程局部的.

  • 用于Visual Studio 2013的http://msdn.microsoft.com/en-us/library/t6fk7h29.aspx非常明确地指出"在多线程环境中,终止函数是为每个线程单独维护的.每个新线程都需要安装自己的终止因此,每个线程都负责自己的终止处理." (3认同)