C++ designalternativ producers/consumers
Har under en tid arbetat med ett projekt men vill bara försäkra mig om att jag har valt rätt väg (alltid svårt när man inte har någon att brainstorma med).
Använder C++11 med Boost och programmet ser ut som följande idag:
Baserat på "tjänster" som kan beskrivas som flera producers, flera consumers.
Tjänsterna är allt från canbus/i2c/websocket/multicast så datatyper jag behöver skicka mellan varje tjänst har ett brett spann..
Använder i idag boost any samt typeid för att lagra godtycklig datatyp i varje transaktion.
En gemensam cirkulär buffert lagrar alla transaktioner och en "Route" klass ser till att dom hamnar rätt (ibland skall samma transaktion till flera mottagare).
Adressering sker med uuid och detta är även basen för "route reglerna".
Använder en sammordnare(klass) som skapar alla tjänster och även tar hand om start/stop/error signalering.
Denna klassen äger även bufferten och agerar som consumer för att distribuera ut transaktionerna(med hjälp av router klassen) till sitt mål (tjänst).
Tjänsterna skriver till bufferten själva (mutex).
Varje transaktion skickas till sitt mål via Asio vilket gör att jag utnyttjar min threadpool för att inte låsa systemet.
Jag har gjort det enkelt för mig och använder shared_ptr för att lagra varje transaktion i bufferten (verkligen dåligt designval med tanke på overhead).
Det fungerar bra och klarar av att hantera några hundra transaktioner i sekunden utan problem på målplattformen som är raspberry pi (cpu belastning sällan över 15-20%).
Men bara för att det fungerar betyder det inte att det är det bästa sättet.
Så utan att posta några tusen rader kod, finns det några andra sätt som är bättre? något jag inte tänkt på?