Во-первых, я бы рассмотрел возможность построения этого как три отдельных процесса, используя каналы для их соединения.Канал - это (по сути) небольшой буфер с блокировкой, автоматически обрабатываемой ядром.Если вы в конечном итоге будете использовать потоки для этого, большая часть вашего времени / усилий будет потрачена на создание почти точного дубликата каналов, уже встроенных в ядро.
Во-вторых, если вы решите построить этов любом случае, я бы все-таки серьезно отнесся к тому, чтобы следовать аналогичной модели.Вам не нужно быть надменным в этом вопросе, но я все равно буду думать в первую очередь о структуре данных, в которую один поток записывает данные, а другой - из которых считывает данные.При строгом предпочтении вся необходимая блокировка потока будет встроена в эту структуру данных, поэтому большая часть кода в потоке довольно проста: чтение, обработка и запись данных.Основное отличие от использования обычных каналов Unix состоит в том, что в этом случае вы можете поддерживать данные в более удобном формате, вместо того, чтобы все чтение и запись были в тексте.
Таким образом, то, что я думаю, вы 'в основном это потокобезопасная очередь.При этом почти все остальное становится граничным с тривиальным (по крайней мере, это связано с многопоточностью - такая обработка может и не выполняться, но, по крайней мере, построение ее с несколькими потоками не сильно увеличивает сложность).