出于安全原因,我正在工作的图书馆必须确定拥有的流程阶段。不需要精确的确定,但是诸如 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;
}
假设有一些神奇的技术可以让你的库跳转到初始化优先级的前面并跳转到去初始化优先级的末尾。
如果你的图书馆可以访问这种魔法技术,那么你必须假设其他图书馆也可以访问相同的魔法技术。
如果两个库都尝试跳转到初始化优先级的开头,那么谁会获胜?
这是 Raymond Chen 所说的 “如果两个程序执行此操作会怎样?”的示例。问题.
您可以通过明确定义需求来解决这个问题:
如果您的库有一些逻辑必须在程序中的其他任何内容之前发生,那么您可以做的最好如下:
无论您做什么,您都必须将这些要求传达给您的图书馆用户,并且您能做的最好的事情就是相信他们遵守规则。