有没有办法从库内部确定流程阶段

问题描述 投票:0回答:1

出于安全原因,我正在工作的图书馆必须确定拥有的流程阶段。不需要精确的确定,但是诸如 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;
}
c++ initialization
1个回答
0
投票

如何强制我的库跳转到初始化顺序的开头?

假设有一些神奇的技术可以让你的库跳转到初始化优先级的前面并跳转到去初始化优先级的末尾。

如果你的图书馆可以访问这种魔法技术,那么你必须假设其他图书馆也可以访问相同的魔法技术。

如果两个库都尝试跳转到初始化优先级的开头,那么谁会获胜?

这是 Raymond Chen 所说的 “如果两个程序执行此操作会怎样?”的示例。问题.

好吧,那我该如何解决呢?

您可以通过明确定义需求来解决这个问题:

  • 你们图书馆的责任是什么?
  • 使用您的库的程序的责任是什么?

如果您的库有一些逻辑必须在程序中的其他任何内容之前发生,那么您可以做的最好如下:

使用记录齐全的合同

  1. 向图书馆的用户明确传达其有时间要求
    1. 在“其他事情”发生之前进行初始化(在任何其他静态初始化之前、在启动任何线程之前、在调用竞争库 Foobar 之前等)
    2. “其他事情”发生后要清理
  2. 为您的库的用户提供初始化/取消初始化您的库的方法
    1. 可以为用户提供一个“通用”设置选项,用于延迟初始化您的库,他们可以在 90% 的情况下使用该选项
    2. 必须为用户提供一种更定制的方式来初始化/清理你的库(也许是一个显式的全局“设置”方法,也许你返回一个在销毁时清理库的句柄)

无论您做什么,您都必须将这些要求传达给您的图书馆用户,并且您能做的最好的事情就是相信他们遵守规则。

© www.soinside.com 2019 - 2024. All rights reserved.