Ottimizzare C++/Scrivere codice C++ efficiente/Uso dei thread

Wikibooks, manuali e libri di testo liberi.

Ottimizzare C++
modifica
Copertina Ottimizzare C++/Copertina
  1. Introduzione Ottimizzare C++/Introduzione
  2. Ciclo di vita dell’ottimizzazione Ottimizzare C++/Ciclo di vita dell’ottimizzazione
  3. Scrivere codice C++ efficiente Ottimizzare C++/Scrivere codice C++ efficiente
    1. Costrutti che migliorano le prestazioni Ottimizzare C++/Scrivere codice C++ efficiente/Costrutti che migliorano le prestazioni
    2. Costrutti che peggiorano le prestazioni Ottimizzare C++/Scrivere codice C++ efficiente/Costrutti che peggiorano le prestazioni
    3. Costruzioni e distruzioni Ottimizzare C++/Scrivere codice C++ efficiente/Costruzioni e distruzioni
    4. Allocazioni e deallocazioni Ottimizzare C++/Scrivere codice C++ efficiente/Allocazioni e deallocazioni
    5. Accesso alla memoria Ottimizzare C++/Scrivere codice C++ efficiente/Accesso alla memoria
    6. Uso dei thread Ottimizzare C++/Scrivere codice C++ efficiente/Uso dei thread
  4. Tecniche generali di ottimizzazione Ottimizzare C++/Tecniche generali di ottimizzazione
    1. Input/Output Ottimizzare C++/Tecniche generali di ottimizzazione/Input/Output
    2. Caching Ottimizzare C++/Tecniche generali di ottimizzazione/Caching
    3. Ordinamento Ottimizzare C++/Tecniche generali di ottimizzazione/Ordinamento
    4. Altre tecniche Ottimizzare C++/Tecniche generali di ottimizzazione/Altre tecniche
  5. Ottimizzazione del codice C++ Ottimizzare C++/Ottimizzazione del codice C++
    1. Allocazione e deallocazione Ottimizzare C++/Ottimizzazione del codice C++/Allocazione e deallocazione
    2. Supporto run-time Ottimizzare C++/Ottimizzazione del codice C++/Supporto run-time
    3. Numero di istruzioni Ottimizzare C++/Ottimizzazione del codice C++/Numero di istruzioni
    4. Costruzioni e distruzioni Ottimizzare C++/Ottimizzazione del codice C++/Costruzioni e distruzioni
    5. Pipeline Ottimizzare C++/Ottimizzazione del codice C++/Pipeline
    6. Accesso alla memoria Ottimizzare C++/Ottimizzazione del codice C++/Accesso alla memoria
    7. Operazioni veloci Ottimizzare C++/Ottimizzazione del codice C++/Operazioni veloci

Indice

[modifica] Thread di lavoro

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à.

[modifica] Thread di lavoro multipli

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.

[modifica] Uso di librerie multi-threaded

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.

[modifica] Creazione di librerie multi-threaded

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.

[modifica] Mutua esclusione

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.

Strumenti personali
Altre lingue