C++优雅关闭最佳实践

fre*_*aba 9 c++ unix signals application-shutdown

我正在为*nix操作系统编写一个多线程c ++应用程序.有效终止此类应用程序的最佳做法是什么?我的直觉是我想在SIGINT(SIGTERM?)上安装一个信号处理程序来停止/加入我的线程.此外,是否可以"保证"所有析构函数都被调用(假设在处理信号时没有抛出其他错误或异常)?

Dar*_*ith 4

我想到了一些考虑因素:

  • 指定 1 个线程负责协调关闭,例如,正如 Dithermaster 建议的那样,如果您正在编写独立应用程序,这可能是主线程。或者,如果您正在编写一个库,请提供一个接口(例如函数调用),客户端程序可以通过该接口终止在库中创建的对象。

  • 你不能保证析构函数被调用;这取决于您,并且需要仔细地为每个新的调用删除。也许智能指针会对您有所帮助。但实际上,这是一个设计考虑。主要组件应该具有启动和停止语义,您可以选择从类构造函数和析构函数中调用它们。

  • 一组交互对象的关闭顺序可能需要一些努力才能正确。例如,在删除对象之前,您确定某些计时器机制不会在几微/毫秒/秒后尝试调用它吗?尝试和错误是你的朋友;开发一个可以重复快速启动和停止应用程序的框架,以梳理出与关闭相关的竞争条件。

  • 信号是触发事件的一种方式;其他人可能会定期轮询已知文件,或者打开套接字并接收其上的一些数据。无论哪种方式,您都希望将关闭序列代码与触发事件分离。