Coordinamento di thread in un server con multithreading

1

L'obiettivo è quello di sviluppare qualcosa di simile con un'applicazione quiz: c'è un server a cui i giocatori si connettono. Ad un certo punto, viene avviata una partita. Il gioco consiste nel chiedere ai giocatori alcune domande a risposta multipla e determinare il vincitore sulla base di alcuni criteri.

Il server genera un nuovo thread per ogni client (so che potrebbe essere migliore e più facile da usare select, ma il punto è capire / imparare il multithreading). Gli utenti sono "in attesa" fino a quando un numero sufficiente di utenti è disponibile in modo che il gioco possa iniziare.

Il problema è cosa succede quando inizia il gioco? Il mio attuale miglior approccio è quello di utilizzare molti dati condivisi che sono costantemente raggruppati da tutti i thread e generare un thread di controller di gioco che controlla il gioco.

Più specificamente, avrei una struttura dati Player che ha qualche flag inGame. Quando sono disponibili giocatori sufficienti, il giocatore che lo nota inizia il thread di controllo del gioco e passa i giocatori disponibili ad esso. Il thread di controllo del gioco segna tutti i giocatori disponibili come "in gioco" e assegna loro una domanda. Dopo un po 'di tempo, cerca una risposta. Nel frattempo, i giocatori controllano costantemente gli aggiornamenti dal thread di controllo del gioco.

Ritengo che questo approccio basato sui dati condivisi non sia il migliore. Hai qualche suggerimento su come posso migliorare l'architettura della mia applicazione?

    
posta Paul92 09.01.2016 - 01:52
fonte

1 risposta

1

Se vuoi bloccare un numero di thread fino a quando non sono tutti pronti, il costrutto comune è una "barriera". Lo si inizializza con un conteggio e una volta che molti thread sono in attesa sulla barriera, vengono rilasciati.

Se la tua biblioteca non ha una barriera, puoi implementarne una utilizzando due mutex e qualche logica, come descritto in questa risposta SO citando The Little Book of Semaphores.

    
risposta data 09.01.2016 - 04:08
fonte

Leggi altre domande sui tag