Ich habe eine Schnittstelle mit dem pimpl
idiom, aber die Schnittstelle muss reentrant sein. Das Aufrufen von Threads muss jedoch nicht die Sperre berücksichtigen. Dies ist eine vierteilige Frage und ein Teil unentgeltlich konstruiertes C ++ 11-Beispiel (Beispiel enthalten, um mehrere FAQ-ähnliche Fragen zu beantworten, die ich über re: locking
, pimpl
, rvalue
und C ++ 11, wo die Antworten waren in ihrer Qualität etwas zweifelhaft).
In der Kopfzeile example.hpp:
%Vor%Und dann in der Implementierung:
%Vor%Und meine Fragen sind:
-O4
zur Aktivierung der Link-Zeit-Optimierung sollte es für den Linker möglich sein, den Link zu umgehen Dereferenzierungsaufwand von std::unique_ptr
. Hat das jemand verifiziert? foo_set("asdf")
aufzurufen und das Beispiel korrekt zu verknüpfen? Wir haben Probleme herauszufinden, was die korrekte explizite Template-Instanziierung für const char[6]
ist. Für jetzt habe ich eine Template-Spezialisierung eingerichtet, die ein std::string
-Objekt erstellt und einen Aufruf an foo_set () anfordert. Alles in allem scheint dies der beste Weg nach vorne zu sein, aber ich würde gerne wissen, wie man "asdf" und std::decay
das Ergebnis weitergibt. In Bezug auf die Sperrstrategie habe ich aus verschiedenen Gründen eine offensichtliche Tendenz dazu entwickelt:
Ich habe gelesen, dass ACE auch diese Art der Sperrstrategie verwendet, aber ich ' Ich begrüße einige Kritik aus der realen Welt von ACE-Benutzern oder anderen, die das Schloss als notwendiger Teil der Schnittstelle weitergeben.
Der Vollständigkeit halber, hier ist eine example_main.cpp für Leute, um zu kauen.
%Vor% Und Anweisungen erstellen, um C++11
und libc++
zu verwenden:
Als kleinen Bonus habe ich dieses Beispiel aktualisiert, um die perfekte Weiterleitung mit Hilfe von rvalue-Referenzen in der foo_set()
-Methode einzuschließen. Obwohl es nicht perfekt war, dauerte es länger als ich erwartet hatte, die Template Instanziierung richtig zu bekommen, was ein Problem beim Linken ist. Dazu gehören auch die entsprechenden Überladungen für C-Basistypen, einschließlich: char*
, const char*
, char[N]
und const char[N]
.
Für Frage 1 wäre eine Sache, die ich versucht wäre, SFINAE zu verwenden, um die Lock-Typen einzuschränken, die als LockType
erlaubt in shared_lock_t
oder unique_lock_t
übergeben wurden.
Ie:
%Vor%... aber das wird ein bisschen ausführlich.
Dies bedeutet, dass das Übergeben eines falschen Lock-Typs den Fehler "Nichts entspricht" ergibt. Ein anderer Ansatz wäre, zwei verschiedene bar_capacity
zu haben, die shared_lock_t
und unique_lock_t
exponiert haben, und eine private bar_capacity, die eine Vorlage LockType
akzeptiert.
Wie geschrieben, ist jeder Typ mit einer .owns_lock()
-Methode, die einen in bool
konvertierbaren Typ zurückgibt, ein gültiges Argument ...
Unter Verwendung eines Pimpl-Idioms sollte der Mutex Teil der Implementierung sein. Dies ermöglicht es Ihnen, zu meistern, wenn die Sperre gestartet wird.
Übrigens, warum ein unique_lock verwenden, wenn ein lock_guard ausreicht?
Ich sehe keinen Vorteil darin, die Öffentlichkeit bekannt zu machen.
std :: unique_ptr sollte für die meisten modernen Compiler genauso effizient sein wie ein Zeiger. Nicht verifiziert jedoch.
Ich würde das const char [N] foo_set nicht als
weiterleiten %Vor%aber wie
%Vor%Dies vermeidet die String-Erstellung in der Header-Datei und lässt die Implementierung alles Notwendige tun.
Tags und Links c++ c++11 design-patterns boost locking