PDA

View Full Version : [c] server multithread: far comunicare i vari thread


agosteeno
26-01-2011, 13:21
Salve a tutti. Sto' facendo un server di chat, multithread, dove ogni thread gestisce la comunicazione con un diverso client. Il problema nasce quando un utente vuole mandare un messaggio ad un altro utente: come posso far comunicare il thread associato al primo con il thread associato al secondo??? L'unica cosa che mi e' venuta in mente e' fare una struttura dati condivisa da tutti dove scrivere i messaggi ricevuti dall'utente e scrivere anche il nome dell'utente al quale questo messaggio e' destinato. I vari thread eseguono un ciclo che ad ogni iterazione, oltre alle altre cose che dovra' fare, controlla se ci sono messaggi per lui e in quel caso lo "preleva" e lo spedisce al client.
Il fatto e' che mi sembra una mezza stupidaggine... Qualcuno mi sa' dare un idea migliore?

clockover
26-01-2011, 15:04
Se sei con linux potresti utilizzare le code di messaggi! E' una cifra che non programmo in C comunque dai uno sguardo alla documentazione e non dovresti avere problemi a trovare degli esempi in rete

http://linux.die.net/man/2/msgget
con questo crei una coda di messaggi

http://linux.die.net/man/2/msgctl
qui controlli la coda

http://linux.die.net/man/2/msgsnd
invio e ricezione dei messaggi

agosteeno
26-01-2011, 16:03
Siccome quello che sto' facendo mi serve per il progetto di un esame, ho gia' una libreria (scritta da me) che realizza liste di per tipi generici. La mia idea era usare queste liste. Il punto e' che nn sono sicuro che il modo per realizzarla sia quello che ho scritto nel primo messaggio.
Un'altra soluzione potrebbe essere fare una lista per ogni thread, dove gli altri thread possono solo inserire nuovi messaggi (quindi nuovi elementi della lista) e il thread "proprietario" di quella lista manda un messaggio al client corrispettivo per ogni elemento...

fano
29-01-2011, 14:15
Ehh la comunicazione tra thread non è mia banale... credo che la via migliore sia sempre usa un "file" o assimilabile (socket, coda, pipe..) si può fare anche scambiandosi variabili o cose del genere, ma se 2 devono scrivere contemporaneamente... occhio!

Devi mettere mutex sparsi in giro per il codice :p

agosteeno
29-01-2011, 14:50
Ho creato una piccola libreria che crea una coda e fornisce le funzioni per mandare questi messaggi e leggerli. Ora sto' finendo di scrivere e testando un po', spero di nn avere troppi problemi. Per quanto riguarda la mutua esclusione dovrebbe essere sufficiente fare la lock prima della chiamata di ogni funzione di questa libreria. Grazie per l'aiuto. :)

nico159
29-01-2011, 15:31
Ho creato una piccola libreria che crea una coda e fornisce le funzioni per mandare questi messaggi e leggerli. Ora sto' finendo di scrivere e testando un po', spero di nn avere troppi problemi. Per quanto riguarda la mutua esclusione dovrebbe essere sufficiente fare la lock prima della chiamata di ogni funzione di questa libreria. Grazie per l'aiuto. :)
Se ti è permesso di usare librerie esterne, dovrebbe non essere difficile trovare implementazioni lockfree della coda

agosteeno
29-01-2011, 15:55
Non ho ben capito cosa intendi per esterne... Quello che sto' fancendo e' una chat client server con socket AF_UNIX (che gira in locale insomma) e devo attenermi allo standard posix. Il problema nasce dal fatto che ogni thread gestisce un client diverso e devo farli comunicare quando un client vuole mandare un messaggio ad un altro. Quindi la mutua esclusione non e' trascurabile.