The3DProgrammer
28-03-2008, 08:22
Salve a tutti, ho un problema con un progetto che sto sviluppando. Il mio obiettivo è realizzare un sistema di grid services tramite il toolkit globus che simuli il funzionamento di un file system remoto e distribuito. Tra le altre cose il mio compito è quello di realizzare il meccanismo di mutua esclusione nell'accesso ai files del sistema, meccanismo che ho pensato di realizzare sin da subito seguendo il classico schema lettore/scrittore sfruttando i monitor, presupponendo il fatto che il container, ad ogni richiesta pervenuta da parte dei clients associasse un thread. Purtroppo mi rendo conto che non è così: in realtà il container dei grid services utilizza un thread pool e una coda delle richieste, ad ogni richiesta (invocazione di un metodo remoto) viene associato un thread che successivamente viene distrutto o viene utilizzato per servire altre richieste di altri threads. Questo implica un bel casino, perchè se ad esempio il mio client invoca una readLockRequest() sul servizio e successivamente una readUnlockRequest(), non è detto che il thread che le gestisce sia sempre lo stesso, il che porta irrimediabilmente ad una IllegalMonitorStateException (credo che il problema sia questo, purtroppo nn esiste nemmeno un minimo di documentazione su come il multithreading è implementato nel container o almeno io nn riesco a trovarla). Morale della favola non posso sfruttare wait() e notify() per gestire la mutua esclusione. Ora il max che la mia mente stanca è riuscita a partorire è sostituire la wait con:
public boolean writeFileLock(....){
....
//recupero il descrittore del file
do{
synchronized(this){
if(fileDescriptor.getLockStatus() == FileDescriptor.FREE)
break;
}
try{
Thread.sleep(200);
}
catch(..){...}
}while(true);
...
}
che è orrendo, ma è l'unica soluzione che ho trovato, per altro ancora non funziona nemmeno bene. Qualche consiglio?
public boolean writeFileLock(....){
....
//recupero il descrittore del file
do{
synchronized(this){
if(fileDescriptor.getLockStatus() == FileDescriptor.FREE)
break;
}
try{
Thread.sleep(200);
}
catch(..){...}
}while(true);
...
}
che è orrendo, ma è l'unica soluzione che ho trovato, per altro ancora non funziona nemmeno bene. Qualche consiglio?