Não sei ao certo o que você está perguntando, acho que você está perguntando por que é que, se você usou memória compartilhada, também precisa usar o bloqueio para garantir que seu escritor e leitor não entrem em conflito, mas você pode escrever Lendo de um cano sem qualquer travamento. Naturalmente, a extensão do bloqueio requerido depende da estrutura de dados usada; por exemplo, há buffers de anel que são praticamente livres de bloqueio.
Se assim for, a resposta é bastante simples: um pipe é uma abstração. O bloqueio para o pipe (na medida em que as estruturas de dados do pipe o exigem) está oculto no kernel.