Dai un'occhiata a questo tutorial per pthreads . Anche se non utilizzi i pthread, i concetti generali si applicano ancora alla libreria di threading che stai utilizzando.
In particolare, guarda la Sezione 7 per i mutex e la Sezione 8 per le variabili condizionali. A prima vista, non sembra che si stia utilizzando qualsiasi tipo di segnalazione o mutex per controllare il flusso del programma. Un thread che domina le operazioni è un segno rivelatore di quel problema.
Supponendo che stai usando una singola area per passare i dati tra i tuoi due thread, avrai bisogno di una sorta di meccanismo per controllare l'accesso su quell'area di dati. Un mutex è la via generale per risolvere questa sfida, ma puoi usare anche i semafori per controllare l'accesso.
Come alternativa e se stai usando un sistema Linux / POSIX che supporta le pipe FIFO, puoi invece usarlo. Dovrai valutare il costo dell'accesso al sistema FIFO rispetto al costo di implementazione dei mutex. Personalmente, ritengo che i FIFO siano sostitutivi di IPC (comunicazione tra processi) e non siano una grande opzione al posto di un mutex. Ma è un'alternativa e se non riesci a capovolgerti usando un mutex o un semaforo, allora i FIFO sono un'opzione.