Quali lezioni hai appreso da un progetto che ha quasi / effettivamente fallito a causa del cattivo multithreading?
A volte, il framework impone un certo modello di threading che rende le cose di un ordine di grandezza più difficili da ottenere.
Per quanto mi riguarda, devo ancora riprendermi dall'ultimo fallimento e sento che è meglio per me non lavorare su nulla che abbia a che fare con il multithreading in quel framework.
Ho scoperto di essere bravo nei problemi di multithreading che hanno un fork / join semplice e in cui i dati viaggiano solo in una direzione (mentre i segnali possono viaggiare in una direzione circolare).
Non sono in grado di gestire la GUI in cui alcuni lavori possono essere eseguiti solo su un thread strettamente serializzato (il "thread principale") e altri lavori possono essere eseguiti solo su qualsiasi thread tranne il thread principale (i "thread di lavoro") e dove dati e messaggi devono viaggiare in tutte le direzioni tra N componenti (un grafico completamente collegato).
Al momento in cui ho lasciato quel progetto per un altro, c'erano problemi di deadlock ovunque. Ho sentito che 2-3 mesi dopo, diversi altri sviluppatori sono riusciti a risolvere tutti i problemi di deadlock, al punto che può essere spedito ai clienti. Non sono mai riuscito a scoprire quel pezzo di conoscenza mancante che mi manca.
Qualcosa riguardo al progetto: il numero di ID messaggio (valori interi che descrivono il significato di un evento che può essere inviato nella coda messaggi di un altro oggetto, indipendentemente dal threading) viene eseguito in diverse migliaia. Anche le stringhe univoche (messaggi utente) arrivano a circa mille.
aggiunto
La migliore analogia che ho ricevuto da un altro team (non correlato ai miei progetti passati o presenti) è stata quella di "mettere i dati in un database". ("Database" che si riferisce alla centralizzazione e agli aggiornamenti atomici.) In una GUI che è frammentata in più viste tutte in esecuzione sullo stesso "thread principale" e tutto il sollevamento pesante non GUI viene eseguito nei singoli thread di lavoro, i dati dell'applicazione dovrebbero essere archiviato in un unico caso che si comporta come un database e lasciare che il "database" gestisca tutti gli "aggiornamenti atomici" che implicano dipendenze di dati non banali. Tutte le altre parti della GUI gestiscono solo il disegno dello schermo e nient'altro. Le parti dell'interfaccia utente potrebbero memorizzare oggetti nella cache e l'utente non noterà se è obsoleto di una frazione di secondo, se progettato correttamente. Questo "database" è anche noto come "il documento" nell'architettura Document-View. Sfortunatamente, la mia app in realtà memorizza tutti i dati nelle viste. Non so perché fosse così.
Collaboratori:
(i partecipanti non devono utilizzare esempi reali / personali. Le lezioni di esempi aneddotici, se giudicato credibile da te stesso, sono anche ben accette).