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

    [C] pthread_create, la routine non si avvia

    Ciao a tutti, ho un problema con la funzione pthread_create(). La chiamata ritorna un valore positivo, ma la routine specificata non viene eseguita. Ecco il codice:

    codice:
    pthread_t t_id;
    //acp è un intero, ovvero la socket sul quale il thread legge un messaggio
    //worker è la routine da eseguire.
    
    thread = pthread_create(&t_id, NULL, &worker, (void*)acp); 
                        if(thread == -1){
    				perror("Crezione thread"); 
    				return -1;
    			}
                printf("Thread creato\n"); 
                pthread_detach(t_id);
    Il risultato è che ho la stampa di "Thread creato", ma la stampa inserita nella prima riga dopo le dichiarazioni della funzione worker non viene eseguita.
    Com'è possibile?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Se la funzione è:

    codice:
    void* worker(void*);
    Allora la chiami così:

    codice:
    pthread_create(&t_id, NULL, worker, (void*)acp);

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Se worker è il nome della funzione che il thread deve eseguire, non devi passarne l'indirizzo con la &. Inoltre, leggi attentamente la documentazione della pthread_create():

    ...
    RETURN VALUE
    On success, pthread_create() returns 0; on error, it returns an error number, and the contents of *thread are undefined.
    ...
    non è detto che, in caso di errore, la pthread_create() restituisca -1, è certo solo che restituisce un valore diverso da 0, pertanto modifica il controllo dell'errore con

    codice:
    thread = pthread_create(&t_id, NULL, worker, (void*)acp); 
    if (thread) {
        perror("Crezione thread"); 
        return -1;
    }
    ammesso poi che acp sia corretto come argomento, cosa che non si può stabilire dallo snippet che hai postato.
    every day above ground is a good one

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Dunque, ho corretto il passaggio dell'indirizzo della funzione worker, e stampando il valore restituito da pthread_create ottengo 0, ma ancora non viene eseguita la routine.
    Acp è il valore ritornato da una chiama alla accept, anche il test di questo valore non evidenzia problemi in quanto viene restituito un socket descriptor valido...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Smoke666
    Acp è il valore ritornato da una chiama alla accept, anche il test di questo valore non evidenzia problemi in quanto viene restituito un socket descriptor valido...
    Ma è un puntatore? Come è definito?
    Inoltre, in base a cosa affermi che la funzione non venga eseguita? Provi a stampare qualcosa senza successo? Se la pthread_create() restituisce 0, significa che il thread viene creato correttamente. A quel punto il problema deve essere necessariamente altrove.
    every day above ground is a good one

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Acp per sua natura è un intero. La prima istruzione della routine è printf("sono il thread\n"); e non vienè mai stampato. Inoltre il server che crea il thread rimane in attesa fin tanto che il thread non termina, infatti il programma va in loop...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Smoke666
    Acp per sua natura è un intero.
    Intendi quindi dire che nel codice hai qualcosa del genere

    codice:
    int acp;
    ...
    acp = accept(...);
    ?

    Allora il passaggio del quarto argomento della pthread_create() è sicuramente sbagliato, da modificare con

    codice:
    pthread_create(&t_id, NULL, worker, (void*) &acp);
    va da sé che l'accesso al parametro corrispondente nella funzione worker() deve essere fatto in un certo modo.
    every day above ground is a good one

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Quindi nel worker per castarlo a int* dovrò fare int* x = (int*)acp... Ma questo non dovrebbe essere indipendente dalla stampa della prima istruzione?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Puoi anche scrivere, in worker(), qualcosa come:

    codice:
    int x = *((int *) arg);
    non è detto che sia quella l'origine del problema, ti sto segnalando ciò che di anomalo si nota nel codice che hai postato ma per il resto il problema potrebbe essere anche altrove.
    every day above ground is a good one

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ora non posso testarlo, domattina spero di risolvere..il punto è che con il debugger ddd non posso "seguire" il worker, e testato separatamente non da errori..

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.