Per*_*xty 6 c++ templates template-specialization c++11
我有一个混合锁定类,旋转尝试锁定(编译时固定)旋转次数,然后再回到阻塞状态,std::mutex直到锁定变为可用.
简化:
#include <mutex>
template<unsigned SPIN_LIMIT>
class hybrid_lock {
public:
void lock(){
for(unsigned i(0);i<SPIN_LIMIT;++i){
if(this->mMutex.try_lock()){
return;
}
}
this->mMutex.lock();
}
void unlock(){
this->mMutex.unlock();
}
private:
std::mutex mMutex;
};
Run Code Online (Sandbox Code Playgroud)
在特殊情况下,SPIN_LIMIT==0这可以回归到"平原" std::mutex(即没有可见的旋转).
所以我专门用于:
template<>
class hybrid_lock<0> : public std::mutex {};
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是批准的专门化类模板的方法是另一个(预先存在的)模板吗?
注:我回答的是实际问题,而不是标题中的问题。
好吧,现在hybird_lock<0>和hybird_lock<1>是完全不同的东西,一个源自它std::mutex,另一个包含/包装它。这改变了它的整个构成hybird_lock及其背后的意义。即它们在语义上并不相同。这可能会导致一些相当意想不到的后果——hybird_lock<0>会继承很多东西,而其他情况则不会。
如果这是唯一的区别,我根本不会为专业化而烦恼。请记住,零情况将在编译时已知,并且可以肯定的是,整个循环将被完全优化。
如果还有其他重要的(或实际的)优化,我会选择类似的东西:
template<>
class hybrid_lock<0> {
public:
void lock(){
this->mMutex.lock();
}
void unlock(){
this->mMutex.unlock();
}
private:
std::mutex mMutex;
};
Run Code Online (Sandbox Code Playgroud)
此实现是0一种特殊情况,而不是几乎完全不同的情况。