2009-11-10 13 views
10

Sono un principiante su Stack Overflow. Sto lavorando su una piattaforma Unix in C/C++. Conoscendo la programmazione di base su questi aspetti, come posso iniziare con multithreading?Come si inizia a utilizzare la programmazione multithread?

Il multithreading sembra essere molto interessante e voglio approfondire le mie conoscenze al riguardo.

Come potrei iniziare con il multithreading e quali sono le migliori tecniche/libri/ebook/articoli disponibili per afferrare i concetti il ​​prima possibile?

+1

Buone risposte qui sotto. Avevo paura che avresti ottenuto un sacco di "usa questa API. È zeh beeeeeeeeessst !!" ma il punto più importante è quello che ripeterò qui: l'API utilizzata è irrilevante. La maggior parte dei concetti si applica indipendentemente dall'API. Leggi alcune delle risorse pubblicate di seguito. Scegli un problema che pensi di poter mettere in parallelo, quindi provalo. –

+1

Qualunque cosa tu faccia, inizia con ** l'API ** di alto livello. Impara come fare cose prima di imparare come funziona nei dettagli. –

+0

@static_rtti fino a che punto? non si può evitare di comprendere le basi del deadlock e dell'esclusione reciproca. Alcune API di livello inferiore facilitano questa comprensione più di quelle di livello superiore che eseguono tutto il blocco per te una volta entrato nello scope di un monitor. Ti consiglierei di iniziare con quello che ha più senso per te, piuttosto che preoccuparti se è alto o basso. Inoltre, ci sarebbero quelli che discutono contro di te, dicendo che finché non conosci i dettagli, allora NON sai come farlo nel modo giusto. Il tuo commento non è stato di grande aiuto in alcun modo. –

risposta

1

Penso che l'articolo di Wikipedia Multithreading vi darà una rapida panoramica e seguendo i link esterni si otterrà una buona panoramica del tema. Successivamente, o in aggiunta, è possibile leggere il Operating Systems: Design and Implementation di Tanenbaum (ottimo libro). Ma la cosa più importante è, a mio avviso, metterla tra le mani. Quindi scarica semplicemente un'applicazione di esempio da ... diciamo The Code Project o qualsiasi altro sito web troverai e divertiti con esso. Guarda come l'applicazione differisce se usi i blocchi o cosa succede se due thread tentano di accedere alla stessa risorsa e con quale frequenza si verificherà, ecc. Con ciò penso che riuscirai a farcela abbastanza rapidamente. Ed è divertente valutare e giocare con tecniche nuove per se stessi.

6

apprendimento multi programmazione filettatura ha due parti:

  1. come scrivere applicazioni di filettatura multiple
  2. Come utilizzare l'API disponibile (pthread)

Learning programmazione multi-threaded è più difficile, Questo è un buon articolo pubblicato nello Linux Journal che ti aiuterà a capire i principi di base.

Per comprendere meglio Pthread vi suggerisco di leggere questo tutorial - POSIX Threads Programming

C'è anche un buon libro di O'Rielly chiamato PThreads Programming

+0

Sono d'accordo con il libro di O'Rielly ... Ho davvero chiarito la mia comprensione della programmazione multi-threading leggendola, anche se ho finito per usare un framework per aiutare con alcuni dettagli in C++. –

0

Forse un po 'controverso, ma in realtà il multithreading cklicked per me quando ho tentato di risolvi un puzzle di codifica una volta

Il puzzle riguardava la scrittura di codice thread-safe senza l'utilizzo di mutex. I miei primi tentativi sono stati miserabili ma quando finalmente ho capito, era come imparare ad andare in bicicletta - non mi sono mai sentito insicuro sulla concorrenza da allora.

Alcune volte mi sono imbattuto in programmatori che hanno letto libri sull'argomento, ma non riesce a capire cose semplici come il fatto che a volte un compito primitivo non può essere un'operazione atomica.

+0

"un compito primitivo a volte non può essere un'operazione atomica." Molti non sanno che l'incarico non può essere eseguito nell'ordine come scritto nel codice e può infatti essere riordinato dal compilatore che può causare complicazioni.Mi piacciono gli illuminanti articoli di Herb Sutter, Scott Meyers e Andrei Alexandrescu a questo riguardo. – Modicom

+0

La soluzione del puzzle era un progetto senza blocco o utilizzava un meccanismo di blocco (come l'algoritmo di Dekker) diverso da un mutex (AKA dijkstra)? se fosse una soluzione di tipo lock-free, ti dispiacerebbe postare il problema e la soluzione in qualche modo? –

+0

@San Jancinto: In realtà non ricordo dettagli del puzzle. Mi dispiace anche di non averlo salvato, questo era circa 8-9 anni fa e il forum dove è stato pubblicato non esiste più. – sharkin

0

Tutto dipende dai tuoi obiettivi. C'è un sacco di codice e articoli con problemi di multi-threading comuni risolti sulla base del framework dei thread POSIX (vedo il numero di raccomandazioni di buoni articoli qui).La domanda principale è cosa vuoi costruire. Per alcune attività non è consigliabile utilizzare il multi-threading.

Ecco il libro "Foundations of Multithreaded, Parallel, and Distributed Programming" correlato all'argomento trattato e che mi piacerebbe raccomandare. Il vantaggio più significativo è lo stile "relativamente facile da leggere", ma non l'intreccio con l'ideologia dei thread POSIX (che è un problema comune).

2

Se stai per iniziare con il multithreading, il mio consiglio è di prima revisione e capire meglio di I/O sul sistema. Comprende il blocco e l'I/O non bloccante, i segnali, le routine asincrone, i callback e così via. L'I/O è probabilmente una, se non la principale, ragione per aggiungere il multithreading ai tuoi programmi. Con questa conoscenza puoi quindi prendere un libro su thread in pthread o java, o avvolgere la tua mente attorno alla libreria di Boost threads o un'altra libreria di threading per la tua tecnologia preferita.

0

poiché è UNIX perché non iniziare con i processi e le comunicazioni IPC? Ad esempio code di messaggi, memoria condivisa e mutex.

0

Lo studio di vari framework di librerie e strutture O/S è un buon modo per comprendere la concorrenza di basso livello. Gli esempi che trovi possono farti iniziare a scrivere codice concorrente in un breve lasso di tempo.

Dopo aver eseguito il debug di alcuni deadlock e problemi di corruzione della memoria condivisa, scoprirai che hai bisogno di alcuni strumenti per ragionare e scomporre i tuoi problemi di concorrenza. Personalmente mi piace l'articolo The Pillars of Concurrency di Herb Sutter come punto di partenza. L'idea è di capire meglio perché hai bisogno di concorrenza. Stai cercando un tempo di risposta migliorato, calcolo parallelo, una combinazione di motivi?

Comprendere il "perché" ti porterà a un "cosa" migliore. Da lì puoi sempre arrivare a diversi approcci di basso livello: Active Objects, monitor objects, message passing, etc. Come hai detto, c'è molto da sapere in questo campo.

1

Ho trovato questo tutorial molto informativo e chiaramente scritto. Spero che sia utile

Problemi correlati