Ciao a tutti, ho un problema con il mio server scritto in C. Questi funziona regolarmente, creando un thread per ogni connessione che il client gli "propone". Il codice è piuttosto semplice:
In pseudocode:
codice:
void server(){
//inizializzazioni varie
//Ciclo di accettazioni connessioni
while(1){
   if( accept ){
       pthread_create;  //thread detached, nessuna gestione della loro lista. 
   } 
}
}
Il codice sopra proposto funziona se il server è avviato prima del client, in caso contrario no. I messaggi vengono scambiati in maniera del tutto arbitraria, quando con un server, quando con nessuno.
Testando clients e servers "separatamente" (ognuno in un terminale), noto che non ci sono problemi di sorta. Così ho inserito uno sleep(1) prima di ogni accept. In questo modo funziona perfettamente, ma non mi spiego il perchè di questa cosa! Ci sarà sicuramente un problema di sincronizzazione, ma dove? La accept è bloccante, il cliente si sospende fino a che il server non è attivo, poi inizia la comunicazione. Gli unici semafori utilizzati sono per la fine della comunicazione: il cliente invia il messaggio e si sospende in attesa di una risposta. Il server elabora la richiesta e sveglia il cliente. Schematicamente la situazione che si presenta quando il server non è ancora attivo al momento della connessione del cliente:

codice:
Server:                   Clients: 
--------                    tenta la connessione. Si sospende x secondi ritendando la connessione n volte
server attivo            cliente si connette alla socket. 
accept                     cliente invia messaggio. 
ricevo messaggio      sospeso in attesa di risposta. 
elaboro richiesta       ----------------
invio risposta            ----------------
sveglio il cliente        ricevo risposta e termino. 
loop.                       ---------------------------
Dunque, dando per scontato che se il ciclo è nella forma

while(1){
sleep(1);
accept;
pthread_create();
}

il server serve correttamente tutti, mi trovo nella situazione in cui devo sostituire lo sleep con "qualcos'altro". Nelle specifiche è infatti vietato l'uso di sleep o alarm per far fronte a problemi di race condition o deadlock. Qualcuno potrebbe aiutarmi anche solo a capire perchè lo sleep rende il sistema stabile e comunicante? Aggiungo anche che i server (che in questo caso sono 3) ricevono correttamente la richiesta di un cliente solo, ma quando i clienti aumentano le richieste non arrivano correttamente.

Grazie in anticipo.