Mi lascia perplesso il fatto che a questi oggetti si acceda in maniera così disinvolta dai due thread... devi stabilire per ogni oggetto (1) chi è l'oggetto "proprietario" (che si occupa della sua cancellazione) e (2) in che thread "vive" (o almeno, in che thread nasce e muore). Mischiare tutto in questa maniera non ti può dare che problemi.

Nello specifico, perché il server fa client->close() se già ci pensa l'altro thread quando riceve la notifica di disconnessione?