【问题标题】:Can I sandbox a namespace that uses static data?我可以对使用静态数据的命名空间进行沙箱处理吗?
【发布时间】:2012-03-13 00:24:17
【问题描述】:

假设我在namespace foo 中有(相当大的)C++ 模块,它有很多(嗯,至少一个)静态数据、命名空间全局数据和单例等等,分布在无数的文件和目录中.有什么方法可以“沙箱化”整个事情,以便同时运行独立版本(即在同一个过程中)。运行多少个版本将在运行时决定。

我曾考虑将所有内容包装在几个命名空间中(例如bar1::foobar2::foo、...),但这是 a) 不可能的,因为我不想接触所有文件,并且 b) 它不会使我能够在运行时拥有任意数字。


更新:我在想也许我可以为每个版本创建单独的线程,但我不太熟悉线程。

【问题讨论】:

  • 附带说明:不,我没有写foo,是的,我知道静态/单身人士是邪恶的。
  • +1,曾经在第 3 方 C 接口上遇到过非常相似的问题。没有找到好的解决方案(我的解决方案涉及多个宏生成的命名空间)。

标签: c++ static singleton extensibility


【解决方案1】:

考虑将您的foo 代码放入共享对象中。在运行时,您可以根据需要随时加载和卸载该共享对象。

有关动态加载共享对象的初步参考,请查看http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

【讨论】:

  • 不幸的是,dlopen 的联机帮助页告诉我们:“如果使用 dlopen() 再次加载相同的库,则返回相同的文件句柄。”所以这种方法确实直接起作用。 libld 也很聪明,可以识别符号链接和硬链接。但是,复制共享对象库就可以了。然而,由于这种性质,我们仅限于通过 C(而不是 C++)接口相互交谈。
【解决方案2】:

基本上你已经创建了一个带状态的命名空间,这很糟糕,你想为这个用例使用一个类,你应该能够很容易地改变它,使它成为一个类

那么你有过的地方

namespace foo{
    int state;
    int func();
}

foo::func();

你需要

class foo{
    int state;
    int func();
};

foo foo1;
foo1.func();

【讨论】:

  • 没有。我不是,foo 很大!因此问题。
  • 但是您描述的问题与类的用例相同,为什么您不能使用类?
  • @bitmask 命名空间和类是非常相似的构造,只是类可以复制,如果 foo 很大,那么拥有多个副本仍然是复制它:与类完全相同。也许它也可以帮助您解决问题。
  • 因为更改将是压倒性的(再次:foo 是巨大的)。顺便说一句,这对于较小的示例也是有问题的。想想foo 中的对象,您必须在所有调用中与它们属于哪个foo 对象进行通信。
  • 但是类也可以在其中包含对象,并且它们可以具有类范围的单例,这可能很难看,但不会比您不可能的命名空间复制想法更好。
猜你喜欢
  • 2014-05-10
  • 2010-12-17
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多