Ottimizzare C++/Scrivere codice C++ efficiente/Uso dei thread
Thread di lavoro
[modifica | modifica sorgente]Ogni volta che in un'applicazione interattiva devi eseguire un compito che può richiedere più di una manciata di secondi, assegna tale compito a un apposito thread di calcolo di priorità più bassa del normale.
In tal modo, il thread principale si occupa solo di gestire l'interfaccia utente, ed è pronto a rispondere ad altri comandi. Assegnando al thread di calcolo priorità più bassa del normale, l'interfaccia utente rimane veloce quasi come se non ci fosse un’elaborazione in corso.
Questa linea-guida in realtà non aiuta a migliorare la velocità dell'applicazione, ma solo la sua responsività. Tuttavia, questo è percepito dagli utenti come un aumento di velocità.
Thread di lavoro multipli
[modifica | modifica sorgente]In un sistema multicore, se riesci a suddividere un’elaborazione in più thread, usa tanti thread di calcolo quanti sono i core di processore.
In tal modo ogni core può elaborare un thread. Se i thread di calcolo fossero più dei processori, ci sarebbe contesa tra i thread, e questo rallenterebbe l’elaborazione. Il thread di interfaccia utente non rallenta, in quanto è pressoché inattivo.
Uso di librerie multi-threaded
[modifica | modifica sorgente]Se sviluppi un'applicazione single-threaded, non usare librerie progettate per applicazioni multi-threaded.
Le tecniche per rendere thread-safe una libreria possono dover usare memoria e tempo. Se non usi i thread, evita di pagarne il costo.
Creazione di librerie multi-threaded
[modifica | modifica sorgente]Se sviluppi una libreria, gestisci correttamente il caso in cui sia usata da applicazioni multi-threaded, ma ottimizza anche il caso in cui sia usata da applicazioni single-threaded.
Le tecniche per rendere thread-safe una libreria possono dover usare memoria e tempo. Se gli utenti della tua libreria non usano i thread, evita di fargliene pagare il costo.
Mutua esclusione
[modifica | modifica sorgente]Usa primitive di mutua esclusione solo quando più thread accedono contemporaneamente agli stessi dati, e almeno uno degli accessi è in scrittura.
Le primitive di mutua esclusione richiedono tempo.
Se sei sicuro che in un dato intervallo di tempo nessun thread scrive in un'area di memoria, non c'è bisogno di sincronizzare gli accessi in lettura a tale area.