C++ 有没有更好的方法使类支持线程安全版本和不安全版本?
我有很多类似于下面的结构,使其支持线程安全版本和不安全版本:C++ 有没有更好的方法使类支持线程安全版本和不安全版本?,c++,C++,我有很多类似于下面的结构,使其支持线程安全版本和不安全版本: 类空互斥 { 公众: 无效锁(){} void unlock()noexcept{} bool try_lock(){return true;} }; 类IFoo { 公众: 虚空DoSomething()=0; }; 模板 Foo类:公共IFoo { 互斥体mu互斥体; 公众: void DoSomething()重写 { std::lock_-guard-guard{m_-Mutex}; //…一些行动 } }; 使用FooSt
类空互斥
{
公众:
无效锁(){}
void unlock()noexcept{}
bool try_lock(){return true;}
};
类IFoo
{
公众:
虚空DoSomething()=0;
};
模板
Foo类:公共IFoo
{
互斥体mu互斥体;
公众:
void DoSomething()重写
{
std::lock_-guard-guard{m_-Mutex};
//…一些行动
}
};
使用FooSt=Foo;//单线
使用FooMt=Foo;//多线程
int main()
{
std::shared_ptr foo{new FooMt};
}
但正如您所看到的,我必须将所有实现都写在头文件中,这也增加了我的编译时间。最糟糕的是,它使得需要创建它的类必须有一个模板参数来选择互斥体
类型(那么这个类也将成为一个模板,使情况变得更糟)
我想到的解决方案之一是在头文件中使用Mutex=std::Mutex定义。但是它需要在我的项目中的每个文件中包含这个头文件
有没有更好的办法来解决这个问题?任何建议都将不胜感激。使用FooSt=Foo有什么问题;使用FooMt=Foo代码>?对我来说似乎是个好办法。(事实上,我正要做出这样的回答,但后来我看到您的代码中已经有了它)查找显式模板实例化。当你有一个很好的有限的可能的专业列表时,你不必把所有的东西都放在头文件中。我认为这可能太基于观点了。这里有几个选项可能有用,但并不重要,但您可以编写模板类Foo
,这样可以消除双重别名。这个问题的答案取决于“更好”的定义。使用FooSt=Foo有什么错;使用FooMt=Foo代码>?对我来说似乎是个好办法。(事实上,我正要做出这样的回答,但后来我看到您的代码中已经有了它)查找显式模板实例化。当你有一个很好的有限的可能的专业列表时,你不必把所有的东西都放在头文件中。我认为这可能太基于观点了。这里有两个选项可能有用,但意义不大,但您可以编写模板类Foo
,这样可以消除双重别名。这个问题的答案取决于“更好”的定义