gpt4 book ai didi

c - POSIX 标准对 atexit() 处理程序中的线程堆栈有何规定?什么是操作系统实践?

转载 作者:太空狗 更新时间:2023-10-29 17:12:15 29 4
gpt4 key购买 nike

当我们的 UNIX/C 程序需要紧急退出时,我们使用 exit (3) 函数并安装 atexit (3) 处理程序以进行紧急清理。在我们的应用程序被线程化之前,这种方法一直运行良好,此时 atexit() 处理程序停止正常工作。

我们通过试验了解到一个错误,即线程可能已经死在 atexit() 处理程序中,并且它们的堆栈已被释放。

我在标准链接线程消失与atexit()中找不到引号:从main()返回后线程不再存在,但它是在调用atexit()之前还是之后?在 Linux、FreeBSD 和 Mac 上的实际做法是什么?

在多线程程序中有没有好的紧急清理模式?

最佳答案

Posix 标准

Posix 似乎没有定义 atexit 处理程序是在线程被 exit 终止之前还是之后被调用。

进程“正常”终止有两种(或三种)方式。

  • 所有线程终止。当最后一个线程通过返回或调用 pthread_exit 退出时,atexit 处理程序将运行。在这种情况下,没有其他线程。 (这取决于平台。如果主线程不是通过 exit 终止,某些平台可能会终止其他线程,而其他平台则不会)。

  • 一个线程调用exit。在这种情况下,将运行 atexit 处理程序并终止所有线程。 Posix 没有指定顺序。

  • main 返回。这或多或少等同于在 main 的最后一行调用 exit(),因此可以像上面那样处理。

操作系统实践

在 Linux 中,文档 https://linux.die.net/man/2/exit表示线程由 _exit 调用 exit_group 终止,并且 _exitatexit 处理程序之后调用。因此,在 Linux 中调用 exit 时,任何 atexit 处理程序都会在线程终止之前运行。请注意,它们在调用 exit 的线程上运行,而不是在调用 atexit 的线程上运行。

如果您愿意,在 Windows 上的行为是相同的。

紧急清理模式。

最好的模式是:永远不要处于需要紧急清理的状态。

  • 无法保证您的清理会运行,因为你可以使用 kill -9 或停电。
  • 因此,您需要能够在那种情况下恢复。
  • 如果您可以从那个中恢复,您也可以从中止中恢复,所以您可以使用中止作为您的紧急导出。

如果您不能那样做,或者如果您有想要做的“最好的”清理,atexit 处理程序应该没问题提供您首先优雅地停止进程中的所有线程,以防止在进行清理时进入不一致状态。

关于c - POSIX 标准对 atexit() 处理程序中的线程堆栈有何规定?什么是操作系统实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39655868/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com