スピンが(コンパイル時間固定の)スピン数だけロックを試行して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>
はまったく異なるものです。1つは派生し、もう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;
};
この実装は0
、ほぼ完全に異なるものではなく、特別な場合になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加