Uragano_ ha scritto:
Volevo chiedervi se potete aiutarmi a capire se ci sono errori ed in caso come risolverli.
Guarda, ho letto la traccia e secondo me ... direi che c'è un bel "buchetto" nella analisi/specifica dello scenario. Mi riferisco in particolare alla parte:
La politica di risveglio dei treni in attesa deve dare priorità ai treni che hanno richiesto la stessa direzione dell'ultimo treno uscito dalla tratta
E ti spiego anche il perché. Osserva bene il tuo run() del Treno. Tra l'inizio del run() e la invocazione del richiediTratta() passa un tempo
piccolissimo. Quindi tu avrai 100 thread che in un periodo di tempo davvero piccolo arriveranno TUTTI quanti alla invocazione del richiediTratta(). E ciascuno dei treni si "schiera" in modo fisso da un lato o l'altro della tratta.
Supponiamo di rispettare perfettamente (teoricamente) le probabilità, ovvero su 100 treni hai 48 treni che chiedono di fare A-->B e 52 treni che chiedono di fare B-->A. Vuol dire che ad un certo istante sono tutti "bloccati" e concettualmente accodati per poter passare.
Supponi di far passare come primo treno uno che fa A-->B. Quando questo treno esce dalla tratta, con QUALE logica scegli il prossimo treno da far passare??
Ricorda che ora hai 99 treni bloccati, alcuni da un lato, alcuni dall'altro lato della tratta ma concettualmente sono tutti, come si dice, "sulla stessa barca" ovvero bloccati e nessuno è più particolare dell'altro di per sé. Se dai priorità alla stessa direzione, fai passare un altro A-->B. E quando esce? Dai sempre priorità a A-->B?? Se si continua così, vuol dire che passerebbero prima TUTTI quelli A-->B e poi dopo TUTTI quelli B-->A. Non ha molto senso .... (né molta utilità)
Ma era proprio questo l'obiettivo .... oppure no?
Sarebbe stato molto più utile (e interessante per la logica) richiedere di rispettare la "alternanza". Cioè se prima è passato un A-->B, dopo deve poter passare un B-->A e dopo deve poter passare un A-->B, ecc...
Hai afferrato?