Domanda Programmazione concorrente c ++? [chiuso]


Continuo a sentire la programmazione concomitante in ogni dove. Ragazzi, potete chiarire cosa è e in che modo i nuovi standard c ++ facilitano lo stesso?


44
2017-10-20 15:16


origine


risposte:


La concorrenza riguarda il tuo codice che fa più cose allo stesso tempo. Questo è tipicamente fatto con "thread" espliciti, ma ci sono altre possibilità. Ad esempio, se si utilizzano le direttive OpenMP nel proprio codice, un compilatore che supporta OpenMP genera automaticamente i thread.

Thread è l'abbreviazione di "thread of execution". 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 da main, ma i thread aggiuntivi possono essere avviati dall'applicazione che inizia con una funzione specificata dall'utente. Questi quindi vengono eseguiti contemporaneamente o in parallelo con il thread originale.

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

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, eccetera.)
  • classi di blocco per semplificare la gestione della durata di blocco (std::lock_guard<>, std::unique_lock<>)
  • std::lock e std::try_lock funzioni per gestire l'acquisizione di più blocchi contemporaneamente senza rischiare un deadlock
  • variabili condizionali per facilitare l'attesa di un evento (std::condition_variable, std::condition_variable_any)
  • futures, promesse e attività impacchettate per semplificare il passaggio dei dati tra i thread e attendere che un valore sia pronto. Questo risolve la classica domanda "come posso restituire un valore da un thread".
  • inizializzazione thread-safe di oggetti statici locali
  • il thread_local parola chiave per dichiarare i dati locali del thread

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

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


69
2017-10-20 15:27



Quando dici "come i nuovi standard c ++ facilitano" la programmazione concorrente, presumo tu stia parlando del presto (?) Per essere rilasciato C ++ 09 standard.

Il nuovo standard attualmente presente nella bozza supporta i seguenti elementi che aiutano nella programmazione simultanea:

  • tipi e indirizzi atomici
  • una classe thread
  • thread_local storage (che è stato appena aggiunto al draft standard alcuni mesi fa)
  • mutua esclusione (classi mutex)
  • variabili di condizione - questo è particolarmente utile per Windows, dal momento che 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 MSVC ++, quindi sarà facile ottenere la semantica della variabile di condizione corretta su WIn32.

17
2017-10-20 15:38



Forse questo video potrebbe aiutarti a far brillare un po 'di luce per te :-)
http://channel9.msdn.com/posts/Charles/The-Concurrency-Runtime-Fine-Grained-Parallelism-for-C/


5
2017-10-20 15:18



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


5
2017-10-20 15:19



C ++ CSP2 - Concurrency facile per C ++

http://www.cs.kent.ac.uk/projects/ofa/c++csp/

Il CSP è basato su un paradigma concorrente appropriato in contrapposizione a thread e lock e a tutti gli altri tipi di cose che vengono considerati come un ripensamento.

(Vedi Occam-Pi per un linguaggio di programmazione concorrente (anch'esso basato su CSP))


5
2017-10-20 16:21



La mia presa leggermente diversa, specifica per le direzioni future dei paradigmi di programmazione:

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

Con il miglioramento dell'hardware, migliorerà orizzontalmente (più core) piuttosto che verticalmente (single core più veloce). Ciò significa che le app dovranno avere una "latente concorrenza" per scalare con hardware "più veloce". Le lingue stanno attualmente cercando di evolversi per supportare al meglio questo, per essere nella posizione di miglior linguaggio per lo sviluppo futuro.

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

Spero possa aiutare.


3
2017-10-20 16:15



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

Avrai l'immagine completa della programmazione concorrente e del C ++ dopo averla letta.

Come riassunto, possiamo dire che la programmazione concorrente è fare multitasking. Quando un programma viene bloccato, può fare altre cose. In genere ci viene bloccato mentre attendiamo le connessioni di rete e gestiamo l'I / O. Possiamo facilitare la programmazione concorrente usando fork() e librerie di thread.


1
2017-07-19 02:59