用户提供的 Terminate() 函数必须是线程安全的吗?

2024-02-25

如中所述http://en.cppreference.com/w/cpp/error/terminate http://en.cppreference.com/w/cpp/error/terminate调用终止的原因有很多。我可以想象其中一些原因几乎同时发生在两个线程中的情况。

Q1可以通过以下方式设置终止功能吗std::set_terminate同时被呼叫两次或多次,同时我的意思是第二次呼叫在第一次呼叫结束之前开始。

  Thread1   Thread2
    |          |
    _          |
    t          |
    e          |
    r          |
    m          |
    i          _
    n          t
    a          e
    t          r
    e          m
    -          ?

Q2如果 Q1==YES,那么如果第一次终止结束会发生什么。我想如果它以 std::abort 结束,那么程序就会结束,但是如果用户提供的终止不中止程序会发生什么?

Q3终止函数是由std::set_terminate在导致此终止调用的线程上下文中调用?


Q1

Yes, std::terminate可以同时调用。

Q2

该标准表示这是未定义的行为terminate_handler不要“终止程序的执行而不返回调用者”。在我熟悉的实现中,如果terminate_handler尝试正常或异常地返回,abort()将被调用。

Q3

设定的功能为std::terminate是全局的,而不是线程局部的。因此一个线程可以影响另一个线程。

在 C++98/03 中,terminate_handler使用时terminate由于未捕获的异常而被调用的是抛出异常时有效的异常,而不是抛出异常时有效的异常terminate实际上被调用(尽管它们通常是相同的)。

在 C++11 中,这一点发生了变化,现在的标准表示使用的处理程序是当时就位的处理程序terminate叫做。这一更改是错误的,很可能会在未来的草案中得到纠正。以下是跟踪此问题的 LWG 问题:

http://cplusplus.github.com/LWG/lwg-active.html#2111 http://cplusplus.github.com/LWG/lwg-active.html#2111

Update

在堪萨斯州莱内克萨举行的 2015 年春季会议上,LWG 决定标准化现有行为,并在新行为出现时未指定该行为。terminate_handler生效如果set_terminate在堆栈展开期间调用。 IE。实现可以遵循 C++98/03 规则或 C++11 规则。

为了使您的代码可移植,如果您需要设置terminate_handler,在程序启动期间,在抛出任何异常之前执行此操作,并且不要养成调用的习惯set_terminate在那之后。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用户提供的 Terminate() 函数必须是线程安全的吗? 的相关文章

随机推荐

  • 检查数组的递归情况

    在 PHP 中检查数组是否递归的最佳方法是什么 给出以下代码 来自PHP 手册 http www php net manual en language types array php 73936 print r 将显示递归当到了第三个的时候
  • 如何使用 QT 设置 PATH 变量?

    如何使用 QT 4 8 获取和设置 PATH 变量 我知道我可以使用 STL 中的 getenv 获取 PATH 变量值 但不知道如何使用 STL 或任何基于 Qt 的方法设置它 如果 QT 有它的功能 我想了解并使用它 而不是去使用 Wi
  • SQL Server 2008 将地理点保存为十六进制

    我已将轨迹记录到文本文件中 现在我想将其作为点类型插入 SQL Server 2008 R2 数据库的表中 我使用 OpenRowSet 读取文本文件并将每一行插入临时表中 然后我解析每一行并将正确的值插入到真实表中 文件中的每一行如下所示
  • 使用 Collections.sort 对自定义类数组列表字符串进行排序

    我试图通过声明我自己的匿名比较器来使用 Collections sort 对我的自定义类数组列表进行排序 但排序并没有按预期工作 我的代码是 Collections sort arrlstContacts new Comparator
  • nametuple — 同一定义中不同类型名称的应用

    蟒蛇namedtuple工厂函数允许指定它创建的子类的名称两次 第一次在声明的左侧 然后作为函数的第一个参数 IPython 1 0 0 Python 3 3 1 In 1 from collections import namedtupl
  • ItemNotMappedException: XYZ 没有工作文件夹映射

    我通过 VersionControlOnNonFatalError Eventhandler 收到异常 内容如下 C SqlWorkspace 没有工作文件夹映射 我的机器上确实有该映射 因此 我想知道出了什么问题 该错误是在 worksp
  • 使用派生较多的参数调用重载函数的更好方法,传入派生较少的类型

    我有 16 个带有两个参数的方法 这两个参数中的每一个都可以是 插入 或 删除 它们都实现了 IFragment 我还有四个像这样的辅助函数 static IFragment IntroduceAntecedent IFragment on
  • Laravel - 如何在会话中存储多个对象

    目前 这仅在会话中存储名字 我需要在会话中存储所选用户的一些其他对象 例如级别和城市 我怎样才能做到这一点 id username first name last name level city 1 john John Parks 1 Lo
  • 如果选择了特定的选择选项值,则显示 div

    如果用户从选择下拉列表中选择特定选项值 我会尝试显示 div Example 选择下拉列表包含从数据库获取的动态名称以及列表底部称为 Admin 的静态或永久名称 如果用户选择不是 Admin 的选项 则会显示包含特定表单元素的 div 否
  • 如何在android中将一组按钮对齐到屏幕底部

    在我的布局中有四个部分 分别是标题 可编辑控件 列表和一组按钮 我想将按钮保留在屏幕底部 我对布局做了太多更改 迫使按钮位于底部 但什么也没发生 请提供说明来制作我需要的东西 我也发布布局
  • 如何在传入服务器的所有 HTTP 请求中包含 php 脚本

    我有一个名为init php我希望自动包含在发送到我的服务器的每个 HTTP 请求中 我的服务器采用 LAMP 配置 采用 PHP 5 3 和快速 CGI 任何实现这一目标的方法都是受欢迎的 我已经尝试过的 我已经尝试过auto prepe
  • Fragment 中的按钮 setOnClickListener onCreateView() 或 onActivityCreated()

    通过这个答案 https stackoverflow com a 32656807 3838663我不明白该把我的东西放在哪里onClickListener 里面onCreateView 或里面onActivityCreated 下面的代码
  • 位桶中没有问题跟踪器按钮?

    我正在尝试在 bitbucket 私有存储库上设置问题跟踪 但没有用于管理 添加问题的按钮 在this https confluence atlassian com bitbucket use the issue tracker 22144
  • ASP.NET MVC 4 - 用于嵌套集合的 EditorTemplate

    我有以下模型类 为了解决这个问题而简化了类 public class Lesson public Guid Id get set public string Name get set public List
  • 触发复选框的更改事件

    我有 7 个复选框 A B C D E F G 当我单击其中之一时 该值将附加到文本区域 如果我取消选中一项 该值将从文本区域中删除 jquery代码如下 var checkboxes input type checkbox checkbo
  • facet_grid 中每个图基于密度的独立 alpha

    我正在构建一个facet grid using stat hexbin但是我希望每个方面图的 alpha 值都是独立的 我目前正在使用以下代码 ggplot data aes x y fill z stat binhex bins 20 a
  • 在 Bash 中连接变量[重复]

    这个问题在这里已经有答案了 我正在尝试将一个变量添加到变量的中间 因此例如在 PHP 中我会这样做 mystring arg1 12 arg2 endoffile 所以输出可能是20121201endoffile 如何在 Linux bas
  • E492:不是编辑器命令:NERDTree

    当我跑步时vim 打开文件夹时出现以下错误 Error detected while processing VimEnter Auto commands for E492 Not an editor command NERDTree Pre
  • Firefox 插件的“document_start”?

    我来自 Chrome 扩展 所以我习惯于通过设置来定义何时注入文件run at 例如 到document start用于在 DOM 构建之前进行注入 Firefox 插件有等效的吗 是的 相当于content document global
  • 用户提供的 Terminate() 函数必须是线程安全的吗?

    如中所述http en cppreference com w cpp error terminate http en cppreference com w cpp error terminate调用终止的原因有很多 我可以想象其中一些原因几