2017-05-23 8 views
0

Ich möchte direkt in eine boost::lockfree:spsc_queue (oder alternativ eine boost::circular_buffer) von einem boost::asio::async_read Anruf erhalten. Sieht so aus, als müsste ich einen Wrapper schreiben, um die spsc_queue zu MutableBuffer zu machen.boost :: lockfree :: spsc_queue und boost :: asio

Kann jemand eine Anleitung darüber geben, ob dies möglich ist und wie dies zu erreichen ist?

Vielen Dank

+2

'boost :: lockfree: spsc_queue' ist kein geeigneter Puffer für empfangene Bytes. –

+0

danke für heads-up. ist 'boost :: circular_buffer' ein geeigneter Puffer? – schuess

Antwort

2

Jeder Empfangspuffer zusammenhängend sein müssen, wenn asio verwenden.

Da boost::circular_buffer nicht zusammenhängend ist, ist es eher unpraktisch, sie als Byte-Puffer zu verwenden. Dennoch können Sie es asio als 2 Puffer mit scatter-gather I/O präsentieren.

Ein effizienter und praktischer Ringpuffer für I/O ist eine Region von Speicherseiten, die zweimal ohne Zwischenabstand zwischen ihnen zugeordnet sind. Auf diese Weise können Sie in Ihren Umlaufpufferspeicher mit einem read Syscall einlesen, ohne Scatter-Gather-I/O verwenden zu müssen und ohne Pufferdiskontinuität beim Parsen/Lesen des Inhalts zu verarbeiten.