如何从库内部判断进程所处阶段(main前后、多线程启用前后)
库进程阶段判断与初始化方案
出于安全需求,我正在开发的库需要判断所属进程的阶段,无需精确判定,只需区分main函数执行前后、多线程启用前后即可。我希望找到类似std::atexit但适用于启动阶段的机制,目前想到的方案是创建一个用于设置标记的类,并以最高优先级进行静态初始化。
初始方案代码示例
#include <iostream> namespace test { static bool flag; class Check { public: Check(char const* name) : name_(name), flag_val_(flag) {} void Print() { std::cout << name_ << ": flag: " << flag_val_ << "\n"; } private: char const* name_; bool flag_val_; }; class Set { public: Set() { flag = true; } }; static Check late_check __attribute__((init_priority(10000))) ("late check"); static Set set __attribute__((init_priority(2000))); static Check early_check __attribute__((init_priority(1000))) ("early check"); } // namespace test int main(int, char**) { test::early_check.Print(); test::late_check.Print(); return 0; }
补充说明与实际应用思路
无需修改库的初始化逻辑,只需根据main函数是否已执行来执行不同的初始化步骤,即使不够精确,只要能判断main即将执行即可。我计划用最高初始化优先级的Set类设置静态标记,让App构造函数根据标记值执行不同初始化:
代码示例
App.h
class App { public: App(); ...};
App.cpp
static bool flag; class Set { Set() { flag = true; }}; static Set set __attribute__((init_priority(65535))); App::App() { if (flag) DoLateInit() else DoEarlyInit(); }
Client1.cpp
static App myStaticApp;
Client2.cpp
App* myDynamicApp = new App;
更新方案
- @johnfilleau提出的可行方案:让库使用者知晓需在初始化阶段执行指定函数。
- 替代方案:添加更多
mutex和atomic来保证安全行为,不受客户端操作影响,虽起初觉得冗余,但讨论后认为是合理权衡。
内容的提问来源于stack exchange,提问作者uuu777
相关产品推荐
相关产品推荐

