Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Terminazione pulita server multithread

    Ciao a tutti, ho un problema con il mio server multithread. Il server esegue un ciclo infinito di accettazioni di connessioni su una data socket, il ciclo termina (e dunque anche il server) quando viene inviato un segnale SIGINT. Il server deve prima far terminare tutti i thread ancora attivi, e poi terminare eliminando la socket e quant'altro. Ho però un problema: se arrivano ulteriori richieste di connessioni, come le gestisco? Non posso ignorarle, ma non posso neppure accettarle nella funzione di gestione dei segnali. La accept, essendo bloccante, se eseguita senza richieste di connessioni, mi blocca il server non facendolo terminare. Come potrei risolvere? Al momento il ciclo prevede:
    codice:
    while(1)
    if(accept() ){
       tid = pthread_create(); 
       pthread_join(tid); 
    }
    Lo script che testa il server prevede l'avvio di un tot di client, quello del server, uno sleep di 5 secondi prima dell'invio di killall. Nella maniera sopra riportata, non tutti i client comunicano con il server (che è "rallentato" dalla join), e arrivano ulteriori connessioni durante la fase di uscita, trovando la socket già eliminata. Avevo pensato di inserire tutti i thread id in un array e invocare la join su tutti i thread nella funzione di gestione del segnale, ma...è safe? E' corretto farlo? Altrimenti come potrei procedere?

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    1) Chiudi il server socket => causa lo sblocco della accept => se la accept ritorna errore ovviamente non crei il nuovo thread => col socket chiuso nessuno si può più collegare
    2) avvisi i vari thread/socket/client connessi (non so esattamente cosa devi fare "per-thread") che il programma sta uscendo
    3) fai join su tutti i thread per attendere che abbiano completato l'operazione di uscita

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ma la pthread_join non è bloccante se il thread preso in esame è già terminato? Sto cercando da un po se è vero o meno, ma non ho trovato nulla di esaustivo...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Non mi pare, è bloccante forse solo se hai esplicitamente creato il thread di tipo detached (vedi a proposito pthread_detach, pthread_attr_init, PTHREAD_CREATE_DETACHED).

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Si ho detto una cavolata, era "bloccante" in quanto passavo a join non il valore di ritorno di pthread_create, ma il thread id!

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Forse nell'ultima frase hai scritto il contrario di quello che volevi scrivere (pthread_create non ritorna il thread id ma 0 o un numero d'errore).

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Si, a pthread_join io passo un pthread_t... Ma non funziona, si blocca!

    Io faccio così:
    Ogni connessione corrisponde ad un pthread_create. Vengono creati il giusto numero di thread, ma non funziona la join.

    pthread_t *th;

    th = (pthread_t*)malloc(10*sizeof(pthread_t));
    th[i] = (ptread_t) malloc(sizeof(pthread_t));
    pthread_create(t_id[i], ...);
    i++;

    e poi il ciclo con la join lo faccio in questo modo:
    for( ; i !=0 ; i--){
    pthread_join(t_id[i], retval);
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Prova l'esempio che c'è in questa pagina:
    http://en.wikipedia.org/wiki/POSIX_Threads
    fa esattamente quello che devi fare tu.

    Aggiungi se vuoi una sleep(5) prima della parte "wait for all threads to complete".

    Dimmi se ti si blocca anche qui.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Si blocca lo stesso, l'unica differenza è l'uso di un array di pthread_t...che sia li l'errore? Anche se i thread sono creati correttamente!

    codice:
    	t_id = (pthread_t*) malloc(10*sizeof(pthread_t)); 
    	while(running){ 
    		if( (acp = acceptConnection(fd_sock)) != -1 ){
    			t_id[i] = (pthread_t) malloc(sizeof(pthread_t)); 
    			thread = pthread_create(t_id[i], NULL, worker, (void*)&acp); 
    			if(thread == -1)
    				perror("Crezione thread"); 
    			} 
    			printf("Thread ok\n"); 
    			i++; 
    			if(i >= 9) 
    				realloc(t_id, 10*sizeof(pthread_t) ); 
    		}
    	}
    
    	printf("Wait here i vale %d\n", i);
    	int tmp = 0;
    	for(tmp = 0; tmp < i ; tmp++){
    		pthread_join(t_id[tmp], NULL); 
    	}
    	printf("Wait here\n");
    L'output è:
    Thread ok (8 volte).
    Wait here i vale 8


    non termina mai...

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Si blocca lo stesso,
    Ma sei sicuro sicuro?
    Provato adesso (l'esempio in http://en.wikipedia.org/wiki/POSIX_Threads), non si blocca né originale, né con sleep prima della join.
    Che sistema operativo usi? Con che opzioni compili?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.