我有一个混合锁类,它在回退到阻塞 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;
};
在 SPIN_LIMIT==0
的特殊情况下,这会退回到“普通”std::mutex
(即没有可见旋转)。
所以我将其专门用于:
template<>
class hybrid_lock<0> : public std::mutex {};
它工作正常,但是将类模板专门化为另一个(预先存在的)模板的方法是否被批准?
最佳答案
注意:我回答的是实际问题,而不是标题中的问题。
那么,现在 hybird_lock<0>
和 hybird_lock<1>
完全不同,一个来自 std::mutex
另一个包含/包装它。这改变了 hybird_lock
的整个宪法以及背后的意义。 IE。它们在语义上并不相同。这可能会导致一些意想不到的后果 - hybird_lock<0>
会继承很多东西,这是其他案例所没有的。
如果这是唯一的区别,我根本不会为特化而烦恼。请记住,零案例将在编译时已知,并且可以肯定的是,整个循环将被完全优化。
如果还有其他重要的(或实际的)优化,我会去做类似的事情:
template<>
class hybrid_lock<0> {
public:
void lock(){
this->mMutex.lock();
}
void unlock(){
this->mMutex.unlock();
}
private:
std::mutex mMutex;
};
此实现使得 0
一个特例,而不是几乎完全不同的东西。
关于c++ - 如何使用另一个类作为类模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31140870/