【问题标题】:assert() safety in multithreaded context多线程上下文中的 assert() 安全性
【发布时间】:2014-11-20 12:04:37
【问题描述】:

所以我似乎无法找到关于断言是否可用于多线程上下文的可靠信息。

在我看来,如果断言失败,线程会关闭,但其他线程不会关闭?

还是整个进程都被杀死了?

所以基本上是我的问题。在多线程环境中使用 assert 是否安全而不泄漏资源?

【问题讨论】:

  • without leaking resourcesassert() 强制终止程序。无论是多线程还是单线程,您都无法释放资源。基本上,它只是用于调试。你真的需要释放资源吗?
  • 你在哪里寻找这个“可靠的信息”?手册页是否不清楚它“通过调用abort终止程序”?
  • 我的印象是,如果线程正在执行的函数没有终止,线程不会在程序关闭时终止。

标签: c multithreading pthreads


【解决方案1】:

如果你看到assert()man page,它清楚地表明,

这个宏的目的是帮助程序员在他的 程序。消息“文件 foo.c 中的断言失败,函数 do_bar(), line 1287" 对用户毫无帮助。

这意味着,它仅在开发环境中有用[并且应该使用],而不是在生产软件中。 IMO,在开发阶段,您不必担心由assert() 引起的leaks。 YMMV。

完成代码调试后,您可以通过定义 [#define] NDEBUG关闭assert() 功能。

【讨论】:

    【解决方案2】:

    我想说的不止是。如果我看到没有断言的多线程代码,我不会相信它。如果您将其实现稍微简化为:

    #define assert(x) if( !(x) ) abort()
    

    你会发现它对于线程安全或线程特定没有什么特别的。提供无竞争条件是您的责任,如果断言失败,则整个过程中止。

    【讨论】:

      【解决方案3】:

      整个进程被杀死。 Assert 会将表达式、源文件名和行号发送到 stderr,然后调用 abort()。 Abort() 终止整个进程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        • 2012-04-06
        相关资源
        最近更新 更多