gpt4 book ai didi

c - 如何从任何线程安全地使用 exit()

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

根据手册页 (2),exit 函数不是线程安全的:MT-Unsafe race:exit,这是因为该函数试图清理资源(将数据刷新到磁盘、关闭文件描述符等)通过调用使用 on_exitatexit 注册的回调。我希望我的程序能够做到这一点! (我的一个线程在整个程序的生命周期中保持 fd 打开,所以 _exit 对我来说不是一个选项,因为我希望所有数据都写入输出文件)

我的问题如下:如果我小心并且不在我的线程之间共享任何敏感数据(如 fd),那么在一个线程中调用 exit 是否“可接受”多线程程序?请注意,如果发生不可恢复的错误,我只会调用 exit。然而,当程序试图退出时,我不能承受段错误。问题是,任何线程都可能发生不可恢复的错误...

我正在考虑使用 setjmp/longjmp 来“很好地”终止我的线程,但这样做会非常复杂,并且需要在我的代码中的任何地方进行许多更改。

如有任何建议,我们将不胜感激。谢谢 ! :)

编辑:感谢@Ctx 启蒙,我想出了以下想法:

#define EXIT(status) do { pthread_mutex_lock(&exit_mutex);退出(状态); } while(0)

当然,exit_mutex 必须是全局的(extern)。

最佳答案

联机帮助页指出

The exit() function uses a global variable that is not protected, so it is not thread-safe.

因此,如果您以任何方式小心,它也无济于事。

但记录的问题是竞争条件:MT-Unsafe race:exit

因此,如果您确定永远不会从两个线程同时调用 exit(),那么您应该是安全的!例如,您可以使用互斥锁来确保这一点。

关于c - 如何从任何线程安全地使用 exit(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57161596/

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