Als ich letztens eine Aktuelle C++-Referenz durchgeblättert habe, entdeckte ich einen neuen Header, den ich noch nie gesehen hatte - <atomic>.
Dieser Header enthielt mystische Klassen und Funktionen, die anscheinend in Mehrsträngigen Programmen gebraucht werden können. Da dachte ich mir: das wär doch gelacht, wenn ich mich nicht damit auseinandersetzen könnte.
2 Wochen später möchte ich folgendes Präsentieren:
Eine Queue (First-in-first-out Datenstruktur), die ohne Mutexe auskommt und trotzdem threadsicher ist!
Das bedeutet, dass ihr eine Instanz dieser Queue zwischen verschiedenen Threads teilen könnt, die fröhlich und völlig unsynchronisiert draufschreiben und lesen können.
Wie das Möglich ist? Das Stichwort ist "atomics", das sind Variablen auf denen bestimmte Operationen als Unteilbar erscheinen. Kann man diese Operationen in geschickter Weise anordnen, kann man die Threadsicherheit garantieren, ohne auf Mutexe zurückgreifen zu müssen.
Wer sich mehr für Multithreading, Threadsicherheit und Atomics interessiert, dem sei folgender Artikel empfohlen: http://queue.acm.org/detail.cfm?id=2088916
Das Rückgrad der queue ist eine einfach verkettete Liste. Folgende Methoden sind public:
- push_back: Ein Objekt in die Queue kopieren oder hineinbewegen (move-construct)
- emplace_back: Ein objekt in der Queue erstellen
- pop_front: Ein objekt aus der Queue entfernen und zurückgeben lassen
- deallocate: Ein zurückgegebenes Objekt löschen
- size: Aktuelle, ungefähre Größe der Queue ermitteln.
Kompilieren tut das ganze mit:
- Clang >= 3.1, mit -stdlib=libc++
- GCC >= 4.7, mit -D_GLIBCXX_USE_SCHED_YIELD
- Visual Studio >= 2012 (_MSC_VER >= 1700), allerdings ohne emplace_back()
Bitte seht euch die Klasse an, probiert sie aus, verwendet sie, und stellt Fragen! Über konstruktives Feedback würde ich mich freuen!
mfg, fat-lobyte