Ich habe eine Hybrid-lock-Klasse, die Spin versucht eine Sperre für eine (Kompilierzeit fest) Anzahl von Spins vor dem Zurückfallen auf eine std::mutex
bis die Sperre verfügbar wird.So verwenden Sie eine andere Klasse als Klassenvorlage Spezialisierung
Simplified:
#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;
};
Im speziellen Fall von SPIN_LIMIT==0
diese zurückfällt a 'Plain' std::mutex
zu sein (d.h. keine sichtbaren Spins).
Also habe ich spezialisiert, dass auf:
template<>
class hybrid_lock<0> : public std::mutex {};
Es funktioniert gut, aber ist, dass die genehmigte Art und Weise Klassenvorlagen von spezialisierten anderen (vorbestehenden) Vorlage zu sein?
Ich stimme dem Punkt zu. Zum Beispiel könnten Sie eine Instanz von 'hybrid_lock <0> 'an Funktionen übergeben, die einen Verweis auf' std :: mutex' erwarten, aber das gleiche gilt nicht für 'hybrid_lock' alle anderen 'n'. Das könnte dazu führen, dass Programme durch Abstimmen "brechen", was nie ein schöner Anblick ist.NB: Die reale hybride Klasse ist komplizierter als die gezeigte und ein Compiler kann die Vereinfachung nicht erwarten. Vielleicht ist das die Antwort "verwende keine triviale Eindämmung und Weiterleitung". –
Persixty
@DanAllen Das war genau mein Punkt, es ist mehr dran, wie Verhalten auf der Kopie, Zerstörung, etc. Vielleicht für 'std :: mutex' würde es keine Nebenwirkungen geben, aber als ein allgemeines Muster, trotz wie viel Versuchung dies schaut, es ist wahrscheinlich keine gute Idee =). Ich würde mich für eine Neuimplementierung entscheiden, oder, falls nötig, eine etwas ausgefeiltere Methode, wie die Antwort von Roger nahelegt. – luk32