PDA

Visualizza la versione completa : [C]Problemi con il Multi-threading(sotto windows)


mr.and
27-05-2009, 10:54
Salve,
sto implementando un server basato su connessione su socket, che gestisce le richieste di connessione da parte dei client dedicandogli un thread apposito.
In pratica:


while(1){
connessione = accept(listenSocket, (struct sockaddr*)&Client_addr, &sin_size);
ListaServer[n_serv++]=(HANDLE)_beginthreadex(NULL,0,(LPTHREAD_START_ROU TINE)server_dedicato,param,0,&ServID[id_serv++]);
}

dove server_dedicato una funzione che riceve la struttura param(in cui incluso il socket connessione), e , in base ai comandi inviati dal client,svolge determinate operazioni, dopodich termina quando il client si disconnette.

Ora, funziona tutto regolarmente alla prima richiesta di connessione, e come da programma il mio server rimane in attesa di richieste di altre connessioni da altri client, mentre il thread nato dalla beginthreadex fa il suo lavoro.Se per un client cerca di connettersi mentre il primo thread ancora al lavoro o anche dopo che questo terminato, la connessione viene accettata, ma server_dedicato non parte(non esegue neanche una riga di codice), anzi termina tutto.

Non mi sembra che sia molto "concorrente" come server :) .Qualcuno sa come mai questo comportamento??

XWolverineX
27-05-2009, 14:31
Insomma se ho capito bene riesci ad eseguire solo una richiesta. Il secondo thread non parte mai.
Bisognerebbe vedere qualcosa in piu' del codice.

Come mai usi _beginthreadex? Stai usando la CRT?

mr.and
27-05-2009, 15:42
Hai ragione, proprio la _beginthreadex il problema...usavo quella perch sulla documentazione che ho studiato diceva che una funzione che pu essere invocata senza problemi da pi thread che fanno parte dello stesso processo, a differenza della CreateThread, facendo intendere che, a parte questa differenza, fosse completamente indifferente l'uso di una o dell'altra...quando invece evidentemente cos non .

Ti ringrazio vivamente!!

XWolverineX
27-05-2009, 19:39
Il punto che effettivamente, non dovrebbero esserci particolari differenze (da come ho letto nei remarks velocemente), a parte un probabile uso della CRT.

L'unica spiegazione che mi viene in mente che forse, poich __beginthreadex Thread Safe sulla CRT, qualcosa vada in deadlock oppure semplicemente aspetta qualche operazione particolare, cosa che CreateThread salta senza troppi controlli.

Loading