Recentemente ho finito di studiare la programmazione multithread su singoli oggetti condivisi, ma ero curioso di sapere come sarebbero diverse le cose per programmare con successo su più oggetti condivisi?
Recentemente ho finito di studiare la programmazione multithread su singoli oggetti condivisi, ma ero curioso di sapere come sarebbero diverse le cose per programmare con successo su più oggetti condivisi?
Questo è un argomento di ricerca molto caldo. La domanda su come condividere correttamente i dati tra più unità di elaborazione simultanee non ha ancora risposte buone.
Alcuni dei problemi che cambiano e dovresti pensare a:
Con più oggetti condivisi, ti consigliamo di avere thread diversi in grado di lavorare con oggetti diversi allo stesso tempo. Se due oggetti sono diversi, ma correlati, è necessario avere un modo per decidere se possono essere elaborati indipendentemente l'uno dall'altro
Gli oggetti potrebbero spostarsi di più nella memoria man mano che si avvicinano al punto in cui vengono utilizzati (fisicamente più vicini o più vicini)
Più oggetti correlati possono finire nella cache in cache multiple e non correlate. Quelle cache vorranno sapere quando sono diventate invalide, quali potrebbero essere se uno di un gruppo di oggetti correlati viene modificato. Immagina, per esempio, una discussione che attira lo schermo, mentre gli altri thread modificano i dati che vengono disegnati. Come fai a essere sicuro che ciò che vedi sullo schermo abbia senso?
Ci sono diversi modi per accedere agli oggetti, alcuni con effetti collaterali, altri senza. Le modalità di accesso possono influenzare pesantemente le prestazioni: le tecniche di ottimizzazione possono diventare intrattabilmente complesse
La differenza è che di solito quando si hanno più oggetti condivisi, essi vivono in una sorta di collezione (come una tabella hash, lista collegata, albero o altro). Ciò richiede una sorta di schema per il funzionamento del blocco.
La soluzione più semplice è avere un blocco per la raccolta. Un thread può acquisire il blocco, trovare l'oggetto nella raccolta, lavorare su quell'oggetto e quindi rilasciare il blocco. Questo è molto semplice e in alcuni casi è la soluzione migliore. Ma il grande svantaggio è che due thread non possono funzionare su due oggetti diversi nella stessa collezione.
Puoi anche avere un blocco per la raccolta stessa e un blocco per ogni oggetto nella collezione. Quindi si acquisisce il blocco della raccolta, si trova l'oggetto desiderato, si acquisisce il blocco su quell'oggetto e quindi si rilascia il blocco della raccolta (supponendo che non si modifichi la raccolta stessa). Ciò consente ad altri thread di cercare la raccolta e modificare altri oggetti nella raccolta mentre un thread sta lavorando su un oggetto nella raccolta.
Ci sono tutti i tipi di altri approcci "intermedi". Ma il concetto di base è lo stesso: devi comunque assicurarti che una struttura non possa essere accessibile da un thread mentre un altro thread è, o potrebbe esserlo, modificarlo.
Leggi altre domande sui tag programming-practices multithreading