You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从库内部判断进程所处阶段(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:17:54