Domanda

Continuo a sentir parlare della programmazione simultanea ovunque. Ragazzi, potete far luce su ciò che è e in che modo i nuovi standard c ++ facilitano lo stesso?

È stato utile?

Soluzione

La concorrenza riguarda il fatto che il tuo codice esegua più operazioni contemporaneamente. Questo in genere viene fatto con & Quot esplicito; thread & Quot ;, ma ci sono altre possibilità. Ad esempio, se usi le direttive OpenMP nel tuo codice, un compilatore che supporta OpenMP genererà automaticamente thread per te.

Discussione è l'abbreviazione di " thread di esecuzione " ;. In un programma C ++ a thread singolo, l'esecuzione inizia da main (), quindi procede in modo sequenziale. In un programma multi-thread, il primo thread inizia principalmente, ma l'applicazione può avviare thread aggiuntivi che iniziano con una funzione specificata dall'utente. Questi vengono quindi eseguiti contemporaneamente o in parallelo con il thread originale.

In C ++ 0x i thread vengono avviati usando la classe std::thread:

void my_function()
{
    // do stuff
}
std::thread my_thread(my_function); // run my_function in its own thread

Il nuovo standard C ++ 0x supporta anche:

  • valori atomici e operazioni con il std::atomic<> modello di classe,
  • mutex per la protezione dei dati (std::mutex, std::recursive_mutex, ecc.)
  • classi di blocco per semplificare la gestione della durata del blocco (std::lock_guard<>, std::unique_lock<>)
  • std::lock e std::try_lock funzioni per gestire l'acquisizione di più blocchi contemporaneamente senza rischiare il deadlock
  • variabili di condizione per facilitare l'attesa di un evento (std::condition_variable, std::condition_variable_any)
  • futures, promesse e attività pacchettizzate per semplificare il passaggio di dati tra thread e l'attesa di un valore pronto. Questo risolve il classico & Quot; come posso restituire un valore da un thread & Quot; domanda.
  • inizializzazione thread-safe di oggetti statici locali
  • la thread_local parola chiave per dichiarare i dati thread-local

Ho fornito una panoramica più dettagliata della nuova libreria thread C ++ 0x nel mio articolo su devx.com: Multithreading più semplice in C ++ 0x

Scrivo sul multithreading e sulla concorrenza in C ++ sul il mio blog . Sto anche scrivendo un libro sull'argomento: Concorrenza C ++ in azione .

Altri suggerimenti

Quando dici " in che modo i nuovi standard c ++ facilitano " programmazione simultanea, suppongo che stai parlando del prossimo (?) standard C ++ 09.

Il nuovo standard così com'è attualmente in bozza supporta i seguenti elementi che aiutano con la programmazione concorrente:

  • tipi e indirizzi atomici
  • una classe di thread
  • archivio thread_local (che è stato appena aggiunto alla bozza dello standard alcuni mesi fa)
  • esclusione reciproca (classi mutex)
  • variabili di condizione: questo è particolarmente utile per Windows, poiché le variabili di condizione sono difficili da implementare correttamente in Win32. Ciò significa che alla fine Microsoft dovrebbe fornire supporto per le variabili di condizione almeno nel runtime di MSVC ++, quindi sarà facile ottenere la semantica della variabile di condizione corretta su WIn32.

La concorrenza sta avendo più thread di esecuzione per un determinato processo. Ad oggi, C ++ non lo supporta direttamente. Tuttavia, esistono diverse librerie che legheranno una determinata funzione a un nuovo thread di esecuzione. Lo standard Unix è la libreria pthreads.

C ++ CSP2: facile concorrenza per C ++

http://www.cs.kent.ac. uk / progetti / OFA / C ++ CSP /

Il CSP si basa su un paradigma concorrente adeguato rispetto ai thread e ai blocchi e a tutte le altre cose che vengono affrontate come ripensamento.

(Vedi Occam-Pi per un linguaggio di programmazione concorrente (anche basato su CSP))

Il mio punto di vista leggermente diverso, specifico per le direzioni future dei paradigmi di programmazione:

La concorrenza riguarda la scrittura del programma in modo tale che possa fare più cose contemporaneamente se l'hardware lo supporta. Attualmente, la maggior parte delle lingue ha meccanismi piuttosto pesanti e complicati per consentire al programmatore di specificarlo (ad esempio: thread con sincronizzazione manuale, direttive pre-processore OpenMP, ecc.).

Man mano che l'hardware migliora, migliorerà in orizzontale (più core) anziché in verticale (single core più veloce). Ciò significa che le app dovranno avere & Quot; concorrenza latente & Quot; per ridimensionare con " più veloce " hardware. Le lingue stanno attualmente cercando di evolversi per supportare al meglio questo, per essere nella posizione della migliore lingua per lo sviluppo futuro.

C ++ 0x sta aggiungendo più supporto integrato per il " vecchio " metodi di programmazione della concorrenza. Vari fornitori di compilatori stanno aggiungendo & Quot; new & Quot; metodi che astraggono il modello di threading e consentono decisioni di runtime su numeri di thread, ecc. (basato sull'hardware della macchina); per Microsoft in particolare, vedi F #, runtime di concorrenza, estensioni parallele, ecc.

Spero che sia d'aiuto.

Questo è l'articolo migliore per comprendere la programmazione concorrente: Programmazione concorrente

Dopo averlo letto otterrai il quadro completo della programmazione simultanea e del C ++.

Come breve riepilogo, possiamo dire che la programmazione concorrente consiste nel fare il multitasking. Quando un programma viene bloccato, può fare altre cose. In genere ci si blocca durante l'attesa delle connessioni di rete e la gestione degli I / O. Possiamo facilitare la programmazione simultanea usando fork() e le librerie di thread.

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