Const Correctness und Threadsafety
-
Hi,
also ich möchte (mit MFC) eine Threadsichere und Const Korrekte FIFO bauen.
typedef int Message; #include <afxtempl.h> #include <Afxmt.h> class FIFO { public: FIFO() {}; virtual ~FIFO() {}; int GetLength() const; void Add(Message& item); protected: CList<Message, Message> m_list; CCriticalSection m_section; };void FIFO::Add(Message& item) { CSingleLock lock(&m_section); m_list.AddTail(item); } int FIFO::GetLength() const { CCriticalSection& sec = const_cast<CCriticalSection&>(m_section); CSingleLock lock(&sec); //CSingleLock lock(&m_section); // Konvertierung von 'const class CCriticalSection *' in // 'class CSyncObject *' nicht moeglich return m_list.GetCount(); }Der Knackpunkt ist dabei die GetLength() Funktion. Die müsste ja eigentlich const sein (so wie im Beispiel). Dann kann man aber kein einfaches
CSingleLock lock(&m_section);mehr machen. Mit const_cast gehts, aber das will ich eigentlich nicht verwenden. Kann man das noch anders lösen oder sollte ich die GetLength Funktion einfach nicht const machen?
Irgendwie beißen sich hier meine Prinzipien...
-
wie wärs mit "mutable"
da sich die critical section nicht auf den wert ausübt, sondern nur ein paar operationen verzögert ist das denke ich mal tragbar
-
Dein Problem ist, daß die CS eigentlich nichts zur konzeptionellen Konstanz der Klasse beiträgt, aber trotzdem von dem const erfasst wird. Und die Lösung ist eigentlich ganz einfach:
mutable CCriticalSection m_section;.
-
genau das ist die lösung, danke