Da quello che hai scritto mi pare di capire che tu possa essere sicuro di questo:
1) Il consumatore non consumerà mai se non c'è nulla da consumare perchè si blocca in lettura sulla pipe se la pipe è vuota.
2) Nella pipe ci possono essere al massimo due caratteri e, visto che scrivi meno di PIPE_BUF, sicuramente la scrittura è atomica e quindi niente race condition: due produttori possono scrivere sulla pipe tranqullamente visto che la scrittura di uno non può essere interrotta.
Non so bene cosa dire sulla questione della velocità perchè non ho capito cosa intendevi con:
Intendi dire che devi assicurare che il consumatore, una volta schedulato, prelevi esattamente 3 byte ogni volta?il consumatore ha una velocità di "consumo" pari a 3 byte (3 char) per unità di tempo. La pipe deve ospitare al più due char (quindi due byte) per volta...