Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有更好的方法使类支持线程安全版本和不安全版本?_C++ - Fatal编程技术网

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
,这样可以消除双重别名。这个问题的答案取决于“更好”的定义