Quote Originariamente inviata da linoma Visualizza il messaggio
Potresti usare una logica simile ogni thread decrementa un contatore alla cancellazione e solo quando vale 0 cancelli l'oggetto. Naturalmente il contatore viene incrementato ad creazione.
Il fatto è che non è detto che il client chiuda la connessione al server... avendo 2 thread che ci accedono, mi dovrei aspettare 2 chiamate al close(), ma se il client lato suo non richiede la chiusura della connessione il client->close() dal thread della select non arriverà mai e non farà mai il delete...

Quote Originariamente inviata da MItaly Visualizza il messaggio
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?
Hai ragione.
Il problema di gestire tutto da un solo thread è che mi porterebbe a scegliere:
- Il delete del socket si fa SOLO se il client richiede la disconnessione, quindi dal thread della select().
- SOLO al momento della chiusura del server, quindi dal thread principale che gestisce il server.

Per la prima, non vorrei obbligare il client ad eseguire la disconnessione prima di fare lo shutdown del server.
Per la seconda, se il mio server rimanesse in vita per tanto tempo e si connettessero tanti client, dovrei tenere in memoria gli oggetti di ogni client anche se ormai si è disconnesso fino a quando il server rimane up. A meno di fare qualcosa che ad intervalli pulisca questa lista...