Frage

In den meisten Code, den ich geschrieben habe oder überprüft wird Verriegelung über Zusammensetzung erreicht, wo eine Klasse besitzt einen kritischen Abschnitt oder Mutex:

class MyClass
{
    Mutex mMutex;
};

und wenn wandelbar Mitglieder können möglicherweise über mehrere Threads zugegriffen werden, wir erwerben und die Sperre über RAII wie folgt aus:

void MyClass::Method()
{
    Lock lock(mMutex);
    // ...
}

Heute habe ich einige Code überprüft, wo der Code der Umsetzung wurde durch Vererbung sperren, wie folgt aus:

class MyClass : public Mutex
{
    // ...
};

Und Verriegelung wird durch die Klasse Verriegelung ausgeführt „selbst“:

void MyClass::Method()
{
    Lock lock(this);
    // ...
}

Gibt es irgendwelche Vorteile oder Nachteile dieses Ansatzes? Oder ist dies nur ein Stil Problem?

War es hilfreich?

Lösung

Privat Erbe könnte ein wenig mehr Sinn dafür machen, da private Vererbung ist mehr oder weniger eine Art und Weise Zusammensetzung zu implementieren. aber ich, es sei denn es gibt eine Notwendigkeit, vererben Mutex (wie wenn Mutex hatten Mitglieder geschützt, auf die zugegriffen werden musste), ich denke, dass die mehr Standardzusammensetzung Ansatz es ein Mitglied machen würde wahrscheinlich Ursache weniger Verwirrung (wie Leute fragen sich, warum Erbe war anstatt, Mutex Mitglied verwendet wird).

Eine Situation, wo es Sinn, öffentlich zu erben machen könnte, ist, wo Sie Kunden wollen auf diesem Objekt aus irgendeinem Grunde sperren zu können, dann können sie einfach behandeln MyClass als Mutex. Das könnte nicht eine große Design-Wahl sein, da Sie mehr Möglichkeiten für Deadlock öffnen, wenn das Objekt in unerwarteten Weise gesperrt wurde. Wenn die Mutex privat bleibt (ob durch Vererbung oder durch Standardzusammensetzung) die Klasse kann mehr sicher sein, genau wie die Sperre verwendet wird.

ich würde nicht überrascht sein, wenn die Person, die diesen Entwurf eingeführt von .NET beeinflusst wurde, in dem jedes Objekt ist ‚abschließbar‘. Beachten Sie, dass in .NET früher gemeinsam lock(this) sein, aber das Idiom ist in Ungnade gefallen, und jetzt ist es als korrektere ein spezifisches privates Objekt Element zu verwenden, für die Verriegelung haben.

Andere Tipps

Das macht fast nie Sinn. Ist MyClass Objekt eine Art Synchronisation, die Mutex erstreckt? Wenn nicht, dann Erbe an Sicherheit grenzender Wahrscheinlichkeit die falsche Wahl ist, weil es keinen Sinn für den Einsatz MyClass als Mutex macht (das Verhältnis von MyClass zu Mutex ist kein „ist-a“ Beziehung).

Es ist auch gefährlich:

MyClass x;
Lock lock(x);
x.Method();   // uh oh.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top