Il problema di base qui sembra essere che questo thread mantiene il mutex bloccato per impostazione predefinita e lo sblocca solo per un periodo di tempo limitato quando è sicuro che non sia necessario al mutex.
Normalmente, si vuole fare all'incirca il contrario: il mutex è sbloccato di default e viene bloccato solo per un breve periodo di tempo quando assolutamente necessario. Senza conoscere almeno un po 'del resto del codice, però, è difficile essere sicuri del modo giusto per farlo.
Una possibilità sarebbe quella di ristrutturare il codice in modo che solo un singolo thread debba trattare direttamente con le risorse condivise e gli altri due thread abbiano una coda di richieste che inviano a quel thread. Quel thread può quindi dare la priorità alle richieste, in modo che entrambi i thread client ottengano le stesse possibilità di fare le loro cose con le risorse condivise (o forse non necessariamente uguali, ma una quantità appropriata per ciascuna).
Per inciso, se non puoi usare le classi di threading C ++ 11, dovrei almeno prendere in considerazione la scrittura di analogici approssimativi - una classe mutex
che chiama pthread_mutex_create
nel suo ctor, pthread_mutex_destroy
nel suo dtor, e ha un lock
e unlock
che chiamano rispettivamente pthread_mutex_lock
e pthread_mutex_unlock
.
Allo stesso modo, un lock_guard
ha passato un mutex che blocca nel suo ctor, e sblocca nel suo dtor (e possibilmente un wrapper simile per variabili di condizione, ecc.) Linea di fondo: se stai partendo da pthreads, tu è in grado di scrivere un sottogruppo piuttosto consistente del threading della libreria standard abbastanza rapidamente e facilmente.
Entrambi sono abbastanza banali e semplificano il resto del codice abbastanza che il tempo per svilupparli verrà ripagato abbastanza rapidamente. Inoltre, ti daranno cose come la sicurezza delle eccezioni che sono molto più difficili da implementare nella maggior parte degli altri modi.