C ++中同一进程中的多个静态类实例
Posted
技术标签:
【中文标题】C ++中同一进程中的多个静态类实例【英文标题】:Multiple instances of static class in same process in C++ 【发布时间】:2015-03-13 18:47:09 【问题描述】:我正在处理一个用 C++ 编写的大型项目(moses,smt 翻译)。情况是它将初始设置存储在名为“StaticData”的非静态类中,静态字段为“instance”(StaticData.h)。任何其他类都使用“StaticData.GetInstance()”来访问当前的 smt 模型设置。现在的问题是:您将如何使用多个(至少两个)“StaticData”类实例而代码更改最少?可能有什么方法可以隔离部分代码执行,如 C# 中的 AppDomain?
【问题讨论】:
听起来StaticData
是一个单例类。
恭喜!您已经发现了单身人士为何不好。
@JohnDibling,是的。此时加载和使用两个模型(意味着两个“StaticData”实例)的唯一方法是运行两个进程。而且我正在寻找在单个进程中执行此操作的方法。
简短的回答是@NeilKirk 是对的。稍微长一点的答案是取消单例,单例将非常困难和麻烦。
@JohnDibling,我明白了。 C++ 感知解决方案,某种沙盒代码执行怎么样?
【参考方案1】:
怎么样:
#include <unordered_map>
#include <memory>
using namespace std;
class StaticData
public:
static StaticData* CreateState(unsigned int id)
static unordered_map<unsigned int, unique_ptr<StaticData> > states;
auto i = states.find(id);
if (i != states.end())
return i->second.get();
else
states.insert(make_pair<unsigned int, unique_ptr<StaticData> >(
static_cast<unsigned int>(id), unique_ptr<StaticData>(new StaticData())));
return CreateState(id);
private:
StaticData()
;
int main()
StaticData* s = StaticData::CreateState(123);
StaticData* s2 = StaticData::CreateState(124);
StaticData* s3 = StaticData::CreateState(123);
if (s != s3)
return 1;
return 0;
【讨论】:
问题是有几十个其他类使用 StaticData.GetInstance - 我不能全部修补它们 简单更改:GetInstance() return CreateState(1);
以上是关于C ++中同一进程中的多个静态类实例的主要内容,如果未能解决你的问题,请参考以下文章