如何以线程安全的方式退出 C++03 中的程序?

Posted

技术标签:

【中文标题】如何以线程安全的方式退出 C++03 中的程序?【英文标题】:How to exit a program in C++03 in a thread-safe manner? 【发布时间】:2016-03-18 21:40:00 【问题描述】:

我有一个多线程 C++03 应用程序(基于 Linux),我想以线程安全的方式立即终止它。

我曾尝试使用exit(0),但这会破坏一些静态变量,这些变量正被另一个线程积极使用,导致该线程访问释放的内存和破坏的对象,从而导致核心转储!显然 exit() 函数存在数据竞争:“调用此函数会破坏所有具有静态持续时间的对象:运行多个线程的程序不应调用 exit(有关不影响静态对象的类似函数,请参见 quick_exit)。”

C++11 提供了一个线程安全的quick_exit() 函数。但我目前没有能力将这个大型应用程序迁移到 C++11。

我也不想花精力尝试干净地终止/加入线程。这是一个非常复杂的程序,需要大量的工作。

还有其他选择吗?我只想让程序立即退出,不清理,不转储。

编辑:我真正想做的是用不会创建核心转储的东西替换 abort() 调用。而且 abort() 是线程安全的,顺便说一句。

【问题讨论】:

换句话说:你走捷径(没有正确的关机逻辑),现在你后悔了。 也许是kill(getpid(), SIGKILL);? :) 旁注:许多人似乎避免编写关闭代码。他们认为这可以节省他们的时间。但是...然后如何在程序上运行 valgrind 之类的工具? “立即终止”与“线程安全”结合使用时会产生矛盾的短语。做不到。 *** 上的非建设性 cmets 是怎么回事?如果没有这方面的用例,为什么 C++11 中有 quick_exit() 函数? 【参考方案1】:

调用_exit(status)会得到你想要的效果(注意前导下划线)

文档:

http://man7.org/linux/man-pages/man2/_exit.2.html

【讨论】:

【参考方案2】:

不清楚你想终止什么:进程或线程。终止进程并将控制权返回给操作系统通常是安全的,但通过“蛮力”终止线程通常是一个坏主意。原因是许多代码和库是在假设在单线程环境中运行的情况下编写的。杀死一个线程将使一些全局变量处于“量子状态”,这将导致在其他线程中运行的代码出现问题。最好努力在上述代码中找到某个位置并礼貌地“要求”它退出。

【讨论】:

我想退出进程,而不是线程。抱歉,不清楚。

以上是关于如何以线程安全的方式退出 C++03 中的程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地终止线程? (使用指针)C++

如何在退出前安全地关闭所有线程[重复]

C++ - 如何以独立于平台、线程安全的方式以用户首选的日期/时间语言环境格式格式化文件的最后修改日期和时间

线程退出时执行函数,处理资源

C中具有共享队列的线程安全生产者/消费者

如何以编程方式证明 StringBuilder 不是线程安全的?