Policies
-
Folgender Code ist aus Modern C++ Design:
template < class T, template <class> class CheckingPolicy, template <class> class ThreadingModel > class SmartPtr : public CheckingPolicy<T> , public ThreadingModel<SmartPtr> { ... T* operator->() { typename ThreadingModel<SmartPtr>::Lock guard(*this); CheckingPolicy<T>::Check(pointee_); return pointee_; } private: T* pointee_; };1. Die Idee hinter dem guard/Lock im operator-> ist wohl threadexklusiver Zugriff. Die Lebenszeit des Locks ist aber auf die Methode begrenzt und wird im Sinne von RAII bei Methodenende freigegeben (Vermute ich! Eine Implementierung ist an der Stelle im Buch nicht vorhanden, vielleicht Hundert Seiten später im Buch? Bitte meine ungedult zu Entschuldigen aber ich würde diesen Punkt gerne jetzt verstehen). Der Pointer pointee_ wird an den Aufrufer zurüggegeben und nach Zerstörung von guard dürfte der Threadexklusive Zugriff nicht mehr gewährleistet sein. Verstehe ich etwas falsch oder ist ein solches Locking prinzipiell nicht threadsicher?
2. Die Host-Klassen von Policies erben in den Beispielen bisher immer von den Policy-Klassen. Ist das ein wesentliches Implementierungsdetail von Policies? Warum?
Danke
-
Zurück aus dem Urlaub und *push*
Hier haben doch so viele Leute Modern C++ Design gelesen ... angeblich

-
Modern C++ schrieb:
1. Die Idee hinter dem guard/Lock im operator-> ist wohl threadexklusiver Zugriff. Die Lebenszeit des Locks ist aber auf die Methode begrenzt und wird im Sinne von RAII bei Methodenende freigegeben
Ja.
Der Pointer pointee_ wird an den Aufrufer zurüggegeben und nach Zerstörung von guard dürfte der Threadexklusive Zugriff nicht mehr gewährleistet sein.
Zugriff auf was? Auf den Zeiger? Welchen der beiden? Auf das Objekt, auf das sie zeigen?
Verstehe ich etwas falsch oder ist ein solches Locking prinzipiell nicht threadsicher?
Das Locking dient hier dazu, den Check (was auch immer das ist) + return threadsicher abzuwickeln, mehr nicht. Threadsicher ist das allerdings auch nur dann, wenn bei dem entsprechenden ThreadingModel auch ein Mutex gelockt wird. Falls Threadsicherheit nicht notwendig ist, kann man hier ein Modell benutzen, bei dem das Lock rein gar nichts tut.