如何以线程安全的方式退出 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 中的程序?的主要内容,如果未能解决你的问题,请参考以下文章