Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    9

    [C] thread non rileva i cambiamenti a una lista su cui opera il main

    Ciao a tutti, sto realizzando un web-switch in C ma nonostante sia in fase di conclusione ci sono ancora dei piccoli errori.
    All'avvio dell'applicativo, dopo la configurazione dello stesso e l'inizializzazione di una lista di server collegati, contenenti le informazioni degli stessi, viene lanciato un thread con "pthread_create" che deve costantemente verificare l'effettiva disponibilità di questi server. Nel main intanto e negli altri processi istanziati con la fork( ) le informazioni dei server cambiano, esempio: connessioni_attive, dati_trasmessi, dati_ricevuti etc. Mentre queste modifiche sono rese disponibili per tutti i processi figli e per il main, il thread non rileva questi cambiamenti!... come posso fare?

    ps. la lista dei server è dichiarata come globale..

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se il problema è nel codice, come te lo diciamo?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    9
    praticamente il problema è questo: avvio il programma, c'è una fase di configurazione di una lista di server e poi tra le altre cose viene lanciato un thread che ha il compito di controllare l'impostazione active di ogni server.

    la struttura è così dichiarata globale:
    codice:
    static struct server     *srv;
    mentre il codice della struttura è questo:
    codice:
    struct server
    {
        struct server *next;    
        int sport;              
        int sid;                
        struct in_addr saddr;   
        int active;
    };
    il thread è lanciato così:

    codice:
    thcontrolserver = pthread_create(&tid,NULL,ControlServerStatus,NULL);
    tra le varie prove ho verificato che tutte le strutture globali vengono prese dal thread e se modifico quei parametri nel main queste modifiche sono rilevate.
    Il problema è invece che le modifiche fatte a questa lista server non le rileva. In particolare devo verificare se active è stato posto a 0.

    se nel thread scrivo if (srv[i].active), questo vale sempre 1 anche se lo pongo a zero da qualche altra parte.
    Cosa posso fare? Help!

    ps. in fase di configurazione active è inizialmente posto a 1.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Detta così non vedo spiegazioni da poterti dare ...

    Bisognerebbe capire se il valore di i è quello corretto durante l'esecuzione (ovvero se è l o stesso indice a cui tu fai riferimento nel main) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    9
    grazie intanto per il tempo dedicatomi..
    scusami ma ho sbagliato nel scrivere una cosa, l'ho appena verificata.

    il sistema segue questo schema:

    main
    configurazione
    avvio del thread di controllo dei server
    main esegue diverse chiamate ad una funzione ChildMake() per la creazione di figli con l'uso della fork().

    le modifiche alla lista server dal main le rileva, ma non le rileva dalle funzioni di ogni Child, cioè dalle funzioni che vengono chiamate nel parte di programma creato con la fork(). (le modifiche alle altre liste invece continua a rilevarle.)

    non so se ho reso l'idea del problema..

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se non parliamo di thread ma di processi le cose cambiano ...

    I processi creati con la fork hanno spazio di indirizzamento diverso e quindi non puoi condividere le variabili tra loro.

    Devi utilizzare appositi strumenti (Memoria Condivisa) e le funzioni di sistema relative (shmget) oltre a gestire l'accesso condiviso tramite "semafori".
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    9
    avevi ragione.. ho creato un segmento di memoria condiviso contenente l'intera lista dei server. l'accesso a quel segmento di memoria è a disposizione di thread e processi, adesso i cambiamenti sono disponibili a entrambi.
    bisognava solo

    grazie mille..

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.