Esercizio di programmazione concorrente

di il
2 risposte

Esercizio di programmazione concorrente

Ben trovati a tutti. Questo è il mio primo post su questo forum dal momento che, essendo uno studente di informatica, sto cominciando a scontrarmi con alcuni problemini di programmazione.

In particolare sto cercando di inventarmi alcuni piccoli progammi multithread per esercitarmi in vista di un'esame e mi è venuta voglia di scrivere un programmino siffatto: un simulazione del gioco della "morra cinese" (il famoso carta-forbici-sasso, per intenderci) che faccia giocare due thread, con un terzo chiamato a fare da arbitro.
Premetto che a lezione ci hanno spiegato fondamentalmente 3 metodi di sincronizzazione: semafori, lock, e condition da implementare sui lock.

Pensavo di usare questa strategia:
1) Creare una classe condivisa contente i metodi "gioca" e "giudica"
2) Creare due thread "giocatore" che invocano per n volte il metodo "gioca".
3) Creare un thread "arbitro" che invoca n volte il metodo "giudica".

Il metodo "gioca" consisterà nell'estrazione di un numero casuale tra 0 e 2; mentre il metodo "giudica" dovrà, ad ogni ciclo, confrontare i numeri estratti dai due thread e stabilire il vincitore del turno.
Per sincronizzare i thread pensavo ad un semaforo a due permessi: i thread giocatori acquisiscono un permesso ciascuno mentre il thread arbitro li rilascia entrambi dopo aver eseguito.

Ed eccoci alla mia domanda: che strumento posso usare per far sì che i due thread giocatori (che ad ogni ciclo eseguono insieme) rendano visibili all'arbitro ognuno il suo numero estratto?
Il dubbio mi sorge perchè i thread sono 2, ma invocano lo stesso metodo e la loro esecuzione è simultanea all'interno dello stesso turno.

Ringrazio di cuore chiunque vorrà darmi un suggerimento.

2 Risposte

  • Re: Esercizio di programmazione concorrente

    Prova a pensarla cosi':

    hai due giocatori ed un arbitro

    Il tuo programma quando parte istanzia per prima l'arbitro, quindi i due giocatori a cui passa l'arbitro con cui si devono sincronizzare.

    L'arbitro parte e di mette in attesa che dei giocatori si presentino per giocare.

    I giocatori partono, e si mettono in attesa che l'arbitro dica: giocate!.

    Ci sono tue possibilita': l'arbitro sa gia' quanti giocatori ci saranno, oppure sara' il programma a dire all'arbitro:non ci sono piu' giocatori.

    Quando l'arbitro dice giocate!, i due giocatori partono, generano la loro giocata e la dicono all'arbitro, quindi si fermano!

    L'arbitro attende che i due giocatori giochino. Quando hanno giocato, controlla le giocate, decide chi ha vinto, quindi si prepara per una nuova giocata.

    L'arbitro decide il numero di giocate, ed alla fine, invece di dire ai giocatori giocate!, dira' loro terminate!.

    Il programma terminera' solo quando arbitro e giocatori saranno terminati.
  • Re: Esercizio di programmazione concorrente

    migliorabile ha scritto:


    Prova a pensarla cosi':

    hai due giocatori ed un arbitro

    Il tuo programma quando parte istanzia per prima l'arbitro, quindi i due giocatori a cui passa l'arbitro con cui si devono sincronizzare.

    L'arbitro parte e di mette in attesa che dei giocatori si presentino per giocare.

    I giocatori partono, e si mettono in attesa che l'arbitro dica: giocate!.

    Ci sono tue possibilita': l'arbitro sa gia' quanti giocatori ci saranno, oppure sara' il programma a dire all'arbitro:non ci sono piu' giocatori.

    Quando l'arbitro dice giocate!, i due giocatori partono, generano la loro giocata e la dicono all'arbitro, quindi si fermano!

    L'arbitro attende che i due giocatori giochino. Quando hanno giocato, controlla le giocate, decide chi ha vinto, quindi si prepara per una nuova giocata.

    L'arbitro decide il numero di giocate, ed alla fine, invece di dire ai giocatori giocate!, dira' loro terminate!.

    Il programma terminera' solo quando arbitro e giocatori saranno terminati.
    Ti ringrazio molto per la tua risposta, che mi ha già aiutato ad impostare meglio il programma. Però ho ancora il dubbio di come far sì che due thread si passino dati tra loro. Tenete conto che sono davvero un niubbo sia di java che di programmazione concorrente, avendo appena iniziato a preparare il relativo esame.
    Al momento mi vengono in mente due strade, ma su entambe ho dei dubbi:

    - usare una variabile public su cui il thread giocatore scrive il suo tiro, mentre il thread arbitro lo legge.
    - implementare il metodo run del thread giocatore in modo che ritorni un valore, che sarà il tiro giocato di volta in volta

    Entrambi i metodi non mi convincono perchè a lezione ci hanno sconsigliato (quando possibile) l'utilizzo di variabili pubbliche e perchè in ogni esercitazione che abbiamo fatto i metodi run dei thread venivano sempre implementati senza valore di ritorno (void).
    Sono solo coincidenze/pippe accademiche o effettivamente sono regole di buona programmazione che è bene osservare?
Devi accedere o registrarti per scrivere nel forum
2 risposte