Di seguito gli errori più comuni commessi nella prova scritta di Luglio 2016, ordinati per gravità. Chi li ha commessi mantiene l'anonimato, ma merita di essere rimproverato, per cui possa scusarmi per la sgridata. Errori da Cartellino Rosso: -Fare Test & Set in due tempi distinti: se si prende il lock, si controlla se c'è posto in una striscia, si lascia il lock, poi si riprende il lock e si occupa un posto nella striscia, NON E' GARANTITO che ci sia ancora posto, poichè nel frattempo un'altro thread potrebbe avere occupato quel posto di cui avevate verificato l'esistenza. E' come entrare a mensa, vedere se c'è un tavolo libero, e uscire a chiamare gli amici senza avere prima occupato il tavolo. L'errore è molto comune e altrettanto grave. Le strutture dati che devono essere thread-safe si devono testare e poi modificare in un sol colpo, altrimenti si provoca l'introduzione nel codice di bug gravissimi e soprattutto difficilissimi da trovare. -"Striscia1, Striscia2, Striscia3": Pur non essendo un errore legato alla programmazione multithread, non è accettabile progettare del codice dove vengono dichiarate sei strutture dati identiche, e sei metodi di 20 righe ciascuno (striscia1(), striscia2(), ...) TOTALMENTE IDENTICI. Fare così da luogo a codice ripetuto, e soprattutto impossibile da manutenere. Pensate a cosa comporta una minima modifica. Il vostro project leader in azienda potrebbe aprirvi il cranio in due a mani nude se fate così. -while(!pieno) {}. Le attese attive sono utili solo a mantenere la vostra CPU al 100%. Per cui va bene solo se avete in mente di friggervici un uovo di sopra (di nascosto dal project leader aziendale). I thread che aspettano che si verifichi una determinata condizione devono essere sempre posti in wait e svegliati alla bisogna. Errori da cartellino giallo (tendente al rosso): -nonostante la traccia prescrivesse di parallelizzare al massimo il lavoro dei parcheggiatori, ad esempio introducendo un lock diverso per ciascuna striscia, la maggior parte di voi ha usato il lock unico, di fatto producendo un programma privo di parallelismo, perfettamente equivalente a fare tutto dentro CaricaTraghetto senza creare thread addizionali; solo, più lento e inutilmente più complicato. -la traccia prescriveva esplicitamente che CaricaTraghetto() dovesse terminare solo a traghetto pieno, invece molti tra voi hanno lasciato che CaricaTraghetto() terminasse immediatamente appena avviati i Parcheggiatori. Se fate così, ditemi cosa può succedere con il seguente spezzone di codice: ... CaricaTraghetto(); PartiPerMessina(); ... Tiratine d'orecchie: I package e le cartella devono essere rinominate in base alla struttura CognomeNomeMatricola. Se usi NomeCognomeMatricola, poi i vostri docenti potrebbero non accorgersi che avete altri voti in altre prove. Tali voti sono magari già memorizzati correttamente con Cognome,Nome,Matricola nell'ordine giusto. Il prof. si incasina, voi vi trovate senza voto della prova precedente.