【发布时间】:2013-02-28 07:26:54
【问题描述】:
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 Comment Status Rev. 5 N3249 (2011):
GB 71 18.6.2.4 / 18.8.2.2 / 18.8.3.2
std::set_new_handler()、std::set_unexpected()、std::set_terminate()的线程安全性未指定,使得函数无法以线程安全的方式使用。必须指定函数的线程安全保证,并应提供新接口,以便以线程安全的方式查询和安装处理程序。
LWG 1365 接受修改
见论文N3189
【问题讨论】:
-
DR1365 在发布 C++11 之前已通过采用我的回答中引用的数据竞争语言解决。
标签: c++ exception-handling c++11 language-lawyer c++03