Problema di sincronizzazione processi in ambito linux, usando le pipe

di il
1 risposte

Problema di sincronizzazione processi in ambito linux, usando le pipe

Buonasera. Ho un problema che non riesco da risolvere ormai da giorni. Il problema consiste nel sincronizzare le azioni tra due processi che comunicano usando due pipe. In particolare un processo, si occupa di "muovere un giocatore" e scrivere all'altro processo le coordinate aggiornate, in modo tale che l'altro processo(padre) lo possa rappresentare. Il padre, inoltre controlla se il giocatore salga su un oggetto in movimento, in tal caso aggiorna una copia locale ad esso del giocatore per tutto il tempo in cui esso si trova sull'oggetto. Non appena il giocatore "scende", questo deve essere disegnato esattamente nel punto in cui è sceso, anziché essere disegnato nel punto da cui era salito sull'oggetto. Vorrei chiedervi di darmi una mano a risolvere il problema, dovuto al fatto che il giocatore, una volta che collide con l’oggetto(che è un altro processo che si aggiorna nel mentre) non sale affatto sull’oggetto.Inoltre il giocatore, nel suo processo, legge da un’altra pipe in cui il padre scrive la sua versione aggiornata, in modo tale che se si trova in una posizione diversa rispetto alla precedente, assume la nuova posizione, mantenendo le altre caratteristiche invariate. Nel processo giocatore, la funzione che si occupa di aggiornarlo, riceve l’input da tastiera, ma non in maniera bloccante, ovvero se non viene rilevato nulla, il codice va avanti. Vi allego il codice, ripulito da dettagli insignificanti, mantenendo solo ciò che serve per "sbrogliare" la logica, perciò è più uno pseudocodice, anziché il codice vero e proprio “funzionante”. Vi ringrazio per l’aiuto.


void giocatore(Giocatore *giocatore, //.. parametri vari)
{
    // Chiusura degli estremi delle pipe inutilizzati
    close(pipeGiocatore1Lettura);
    close(pipeGiocaScrittura);
    Giocatore giocatoreLocale;

    while (true)
    {
        read(pipeGiocatore2Lettura, &giocatoreLocale, sizeof(Giocatore));
        if(giocatoreLocale.pos != giocatore->poi) // E’ cambiata la posizione
           Giocatore = giocatoreLocale;
        aggiornaGiocatore(giocatore); 
        giocatore->aggiornato = true;
        muoviGiocatore(giocatore);
        write(pipeGiocatore1Scrittura, giocatore, sizeof(Giocatore));
        gioocatore->aggiornato = false;
    }
}


void gioco(// Vari parametri)
{
    Giocatore giocatoreLocale;

    close(pipeGiocatore1Scrittura);
    close(pipeGiocatore2Lettura);

    while (true)
    {
        // Se il giocatore non si è mosso, viene disegnato dove era prima, altrimenti si cancella e si disegna nella nuova posizione
        if(giocatoreLocale.aggiornato)
        {
            distruggiGiocatore(&giocatoreLocale);
           disegnaGiocatore(&giocatoreLocale);
        }
        
        // Rilevamento collisione con un oggetto di un'array di oggetti
        for(int i = 0; i < NUM_OGGETTI; i++)
        {
            if(vaSopra(giocatoreLocale, oggetto[i]))
            {
                if(!giocatoreLocale.aggiornato)
                {
                    giocatoreSopra = true;
                    Posizione pos = oggetto[i].pos;
                    impostaPosGiocatore(&giocatoreLocale, pos);
                   muoviGiocatore(&giocatoreLocale);
                   distruggiGiocatore(&giocatoreLocale);
                   disegnaGiocatore(&giocatoreLocale);
                }
            }
            giocatoreLocale.aggiornato = false;
            giocatoreSopra = false;
        }
    }
}

1 Risposte

  • Re: Problema di sincronizzazione processi in ambito linux, usando le pipe

    Buonasera. Vedo che nel tempo non ci sono state risposte, capisco che il problema non sia semplice. Ho potuto risolverlo usando una singola pipe, che semplifica la gestione di più processi comunicatori. Ciò che mi ha permesso di farlo, però, è la somiglianza tra le strutture dati di un generico oggetto e del giocatore. Il problema pìù generale però rimane irrisolto, ovvero dati due oggetti completamente diversi che devono sincronizzare il loro comportamento tra due processi differenti, come fanno? Non mi interessa per forza la risposta precisa per questo caso, ma come in generale vanno affrontati questi problemi, da un punto di vista progettuale. Spero di essermi spiegato.

Devi accedere o registrarti per scrivere nel forum
1 risposte