Если можно подождать с обработкой до тех пор, пока все данные не приедут, я бы делал так:
1. распределял новый блок данных в слушающем потоке и ждал данных;
2. забивал его данными;
3. когда данные кончились выбрасывал сигнал с указателем на блок;
4. Переходил в п1
А если обработку нужно начинать сразу использовал бы какой-нибудь тип очереди с блокировками. Если данные поступают быстрее чем обрабатываются, то так можно получить выигрыш по сравнению с единственным буфером.