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

    [C] Thread, risorse terminate?

    Ciao a tutti, ho un problema con il mio server multithread. Il server accetta un numero "infinito" di connessioni mediante un ciclo, creando un thread per ogni connessione accettata.

    Avviando 11 clienti che comunicano con 2 server, il protocollo di comunicazione va a buon fine. Se invece i clienti aumentano a 12, una chiamata a malloc nell'ultimo thread mi genera questo errore:

    *** glibc detected *** ./bibserver: malloc(): memory corruption: 0x40404190 ***
    ======= Backtrace: =========
    /lib/i386-linux-gnu/libc.so.6(+0x73e42)[0x400c8e42]
    /lib/i386-linux-gnu/libc.so.6(+0x75905)[0x400ca905]
    /lib/i386-linux-gnu/libc.so.6(__libc_malloc+0x6c)[0x400ccd3c]
    ./bibserver[0x804aed4]
    /lib/i386-linux-gnu/libpthread.so.0(+0x6d4c)[0x40040d4c]
    /lib/i386-linux-gnu/libc.so.6(clone+0x5e)[0x4013face]


    La cosa che mi lascia perplesso è solo una: questo errore si verifica solo con il "dodicesimo thread", tutti gli altri vanno a buon fine! Da cosa potrebbe essere determinato?

    Specifico che i thread sono dichiarati come joinable e faccio un ciclo su di essi alla ricezione di un segnale, che mi indica la terminazione del server.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sicuramente c'è un errore nel codice perché il messaggio indica la "corruzione" della memoria.

    E' un errore che, per vari motivi, si manifesta solo ad un certo punto dell'esecuzione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Io mi ricordo avevo fatto una cosa simile in java tramite una socket, se ci fai vedere il codice forse ti si aiuta

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ora non ho il codice sottomano, ma si trattava di un' allocazione di un array di puntatori ad una struttura da me creata. La struttura dati viene utilizzate regolarmente da tutti i thread, quest'ultimo però fa andare in memory corruption. Appena posso posto un po di codice. Grazie per l'aiuto.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non è che il dodicesimo thread sia "particolare". E' sempre lo stesso codice, in cui c'è qualche errore, che si manifesta in un determinato momento. Quindi non ti concentrare sul "dodicesimo thread" ma sul codice.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Dunque, la porzione di codice incriminato è la copia di un array di puntatori a strutture da me precedentemente definite:

    codice:
    struttura_t ** array = (struttura_t **) malloc(n_puntatori * sizeof(struttura_t*)); 
    
    for( i=0 ; i< n_puntatori; i++){
    array[i] = (struttura_t*) malloc( sizeof(struttura_t) ); 
    array[i] = array_originale[i]   //copia dell'elemento. 
    }
    Inserendo dei "printf" ho visto che è la prima malloc che mi da il memory corruption.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma cosa fai con questa riga

    array[i] = array_originale[i] //copia dell'elemento.

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Copio il puntatore dell' i-esimo elemento presente in "array_originale" nella i-esima posizione di "array". Devo fare un duplicato di array_originale in sostanza.


    Ps. Ho dimenticato le parentesi, le aggiungo subito, è forse per questo che mi hai fatto la domanda! Errore di trascrizione, scusa!

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Smoke666
    Copio il puntatore dell' i-esimo elemento presente in "array_originale" nella i-esima posizione di "array". Devo fare un duplicato di array_originale in sostanza.


    Ps. Ho dimenticato le parentesi, le aggiungo subito, è forse per questo che mi hai fatto la domanda! Errore di trascrizione, scusa!
    Ma scusa, hai appena fatto una malloc e assegnato un puntatore e poi lo cambi perdendo il puntatore allocato ? Ma che senso ha?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Hai ragione, non ha alcun senso, non devo allocare quel puntatore visto che assegno il puntatore presente nell'altro array. Elimino la seconda malloc.

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.