Domanda

Mi chiedo e ho bisogno di strategie che possono essere applicate per ridurre il blocco di basso livello. Tuttavia, il trucco qui è che questo non è un nuovo codice (con decine di migliaia di righe di codice C ++) per un'applicazione server, quindi non posso semplicemente riscrivere il tutto.

Temo che non ci sia una soluzione a questo problema ormai (troppo tardi). Tuttavia mi piacerebbe conoscere i buoni schemi che altri hanno usato.

In questo momento ci sono troppi blocchi e non tanti conflitti, quindi è un problema di prestazioni hardware indotto dalla paranoia. Il modo migliore per descrivere il codice è come un singolo thread thread improvvisamente riempito di blocchi.

È stato utile?

Soluzione

Perché è necessario eliminare il blocco di basso livello? Hai problemi di deadlock? Hai problemi di prestazioni? O problemi di ridimensionamento? Le serrature sono generalmente contese o non contese?

Quale ambiente stai usando? Le risposte in C ++ saranno diverse da quelle in Java, ad esempio. Per esempio. i blocchi di sincronizzazione automatica in Java 6 sono in realtà relativamente economici in termini di prestazioni, quindi semplicemente l'aggiornamento di JRE potrebbe farti superare qualsiasi problema tu stia cercando di risolvere. Potrebbero esserci aumenti di prestazioni simili disponibili in C ++ passando a un altro compilatore o libreria di blocco.

In generale, ci sono diverse strategie che ti consentono di ridurre il numero di mutex che acquisisci.

Innanzitutto, qualsiasi cosa a cui si accede da un singolo thread non è mai necessario un mutex.

In secondo luogo, qualsiasi cosa immutabile è sicura a condizione che sia "pubblicata in modo sicuro" (ovvero creata in modo tale che un oggetto parzialmente costruito non sia mai visibile ad un altro thread).

Terzo, la maggior parte delle piattaforme ora supporta le scritture atomiche, il che può aiutare quando un singolo tipo primitivo (incluso un puntatore) è tutto ciò che deve essere protetto. Funzionano in modo molto simile al blocco ottimistico in un database. Puoi anche usare le scritture atomiche per creare algoritmi senza blocco per sostituire tipi più complessi, comprese le implementazioni di Map. Tuttavia, a meno che tu non sia molto, molto bravo, stai molto meglio prendendo in prestito l'implementazione di debug di qualcun altro (il pacchetto java.util.concurrent contiene molti buoni esempi) - è notoriamente facile introdurre accidentalmente bug quando scrivi i tuoi algoritmi.

In quarto luogo, l'ampliamento dell'ambito del mutex può aiutare - semplicemente tenendo aperto un mutex più a lungo, piuttosto che bloccarlo e sbloccarlo costantemente, oppure prendere un blocco su un elemento "più grande" - l'oggetto anziché una delle sue proprietà , per esempio. Tuttavia, questo deve essere fatto con estrema attenzione; puoi facilmente introdurre problemi in questo modo.

Altri suggerimenti

Il modello di threading del programma deve essere deciso prima di scrivere una singola riga. Qualsiasi modulo, se incompatibile con il resto del programma, può bloccarsi, corrompere il deadlock dell'applicazione.

Se hai il lusso di ricominciare da capo, prova a identificare grandi funzioni del tuo programma che possono essere eseguite in parallelo e utilizza un pool di thread per pianificare le attività. Il trucco per l'efficienza è quello di evitare i mutex laddove possibile e (ri) codificare la tua app per evitare la contesa per le risorse ad alto livello.

Puoi trovare alcune delle risposte qui e qui utile mentre cerchi modi per aggiornare atomicamente lo stato condiviso senza blocchi espliciti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top