Premesso che spiegare e dettagliare meglio l'architettura dell'applicazione sarebbe la prima cosa da fare...
Fai riferimento a sigaction piuttosto che a signal il cui utilizzo mi sembrava essere "deprecated".
La gestione dei segnali in ambito multithread puo' creare a problemi se non si comprende bene cosa accade quando viene inviato un segnale all'intero processo (Come nel caso di ctrlC).
Parti dandoti un'occhiata ad un po' di documentazione.

In situazioni come queste si puo', ad esempio, fare in modo che vi sia un solo thread deputato alla gestione dei segnali.
In tal caso e' sufficiente bloccare tutti i segnali (Agendo sulla signal mask), creare i thread (Che erediteranno la maschera dei segnali) e quindi modificare la maschera in modo da gestire "personalmente" i segnali di proprio interesse in uno solo di tali thread.