PDA

View Full Version : [C++]shared memory: dubbio


trallallero
15-11-2007, 13:41
Ho un dubbio sulla shared memory:

devo far comunicare 2 processi e la cosa più veloce è la shmem (accetto consigli anche su scelte migliori) visto che ho una piccola e fixed area di memoria da usare.

Un server che gira (murmur da me modificato) che comunica con vari clients (mumble da noi modificato) ed un monitor che controlla chi è connesso a chi.

Ho usato una maschera di bit (sandard class bitset (http://www.roguewave.com/support/docs/sourcepro/edition9/html/stdlibref/bitset.html) ) dove ogni bit rappresenta una connessione in una matrice di connessioni. Ogni volta che uno si s/collega aggiorno la maschera e la copio nella shared mem.

memcpy( Server::pShMem + 1, &UserBits, SHARED_MEM_SIZE * 8);

Il monitor con un timer controlla la shared mem, la copia

memcpy( &BtnMatrix, pShMem + 1, SHARED_MEM_SIZE * 8 );
e disegna una matrice.

+ 1 perchè il primo byte è il semaforo ... e quì casca l'asino

in entrambi ho messo questo controllo:

while (*pShMem != SHARED_MEM_FREE_ID) // waits for the semaphore free
usleep(2000);

ma se, per esempio A, dopo aver controllato decide di mettere il semaforo ad 1
ma in quel preciso momento B ha appena controllato e mette a 2 ? c'è un modo per risolvere il problema ? a me sembra di no.

L'unica soluzione che vedo è mettere il monitor in un thread del server ma significherebbe riscrivere tutto!!! il mio monitor è fatto con wxWidgets, il server con QT.

Il problema è che per adesso il monitor fa solo da monitor ma dovrà anche funzionare da interruttore delle connessioni, quindi dovrà anche scrivere sulla shared memory.

Spero di essere stato chiaro ....

grazie

PS: il post è così lungo e dettagliato perchè avevo anche un problema sulla dimensione della memoria, adesso risolto con * 8