Qualcuno può suggerire un progetto per me scrivere per aiutarmi a capire il threading


13

Sono attualmente uno sviluppatore C # con una comprensione piuttosto traballante del threading.

Entrambi questi collegamenti sono stati suggeriti in altri post:

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

Dovrei tornare alle origini e forse guardare alcuni testi di informatica sull'argomento?

Sento davvero che se salto e uso le librerie c # non avrei davvero una solida base di conoscenza su cui basarmi. Penso di dover imparare questa materia da zero come uno studente di scienze, quindi usare le librerie C #.

Qualcuno può suggerire un approccio all'apprendimento del threading, forse alcuni link e o idee di progetto?

Grazie in anticipo!

Modifica, grazie per tutte le risposte. Alcune persone hanno detto che un libro potrebbe essere una buona idea, qualcuno può suggerirlo? Preferirei una lingua agnostica. Qualcuno sa in quale classe verrebbe trattata questa roba in una laurea in Informatica? Sto cercando di cercare su Google alcuni appunti e incarichi online gratuiti.


Non so se questo aiuta, ma questo è un semplice tutorial che ho scritto in VB.Net qualche tempo fa che spiega il concetto di base del threading. Dovresti essere in grado di convertirlo in C # abbastanza facilmente. chrishaas.wordpress.com/2009/06/25/…
Chris Haas,

Sono fortemente tentato di suggerire di scrivere una GUI multithread, sulla base del fatto che insegnerebbe i limiti di ciò che è possibile fare con i thread e rimanere sani di mente. Ma questo non sarebbe costruttivo, quindi lo lascerò guidare come un commento, non una risposta ... :-)
Donal Fellows

Risposte:


3

Scrivi un web server multi-thread. Imparerai un TON . E non solo per il threading.


4

Il problema produttore-consumatore è un classico esempio e ti aiuta a comprendere non solo il threading, ma la pianificazione del processore (può essere dimostrato usando fork () per i processi figlio invece dei thread) e come i tuoi programmi interagiscono con il sistema operativo dietro le scene.

Ecco una carrellata delle cose importanti che dovresti capire riguardo al threading / biforcazione 1. Come il sistema operativo pianifica le attività (ad esempio l'algoritmo round robin) 2. Blocco delle risorse (Se più thread utilizzano la stessa risorsa, non vuoi che accedervi contemporaneamente - BAD THINGS HAPPEN)

Ecco un articolo wiki su questo classico problema: http://en.wikipedia.org/wiki/Producer-consumer_problem

Fondamentalmente, creare un "Produttore" che genera thread di "Consumatori". Il produttore produce una "risorsa" e i consumatori la consumano. Mettilo in un ciclo e guarda cosa succede (sarai sorpreso che alla fine i consumatori consumeranno più risorse di quelle disponibili a causa di metodi non sincronizzati).


Interessante, sembra che ho impostato questo modello senza rendermene conto durante la creazione di un servizio Windows thread. La tua descrizione è stata perfetta. Buono a sapersi, questo sarebbe quasi contrassegnato come una risposta alla mia domanda aperta.
Tony,

2

Scegli uno dei classici problemi altamente paralleli. Potresti trovare più interessante sceglierne uno con speedup super-lineare.

Prendi in considerazione la ricerca in un elenco non ordinato e non indicizzato. Questo problema è banalmente parallelo. Prima implementa una ricerca a thread singolo, quindi una ricerca parallela ingenua. Implementare il furto di lavoro. Generare alcuni set di dati casuali ed eseguire tutte e tre le versioni sugli stessi set di dati. Calcola la velocità.


0

Non credo che un libro di testo sia il prossimo passo migliore. Un progetto è la strada da percorrere. Dovrebbe essere qualcosa di cui sei entusiasta.

La prima volta che ho fatto il threading stavo migliorando le prestazioni di un web crawler. Puoi eseguire la scansione molto più velocemente se non esegui tutti gli I / O della tua rete in seriale. Questo è un ottimo progetto per cominciare perché puoi affrontarlo in molti modi, ma non è così complicato come, diciamo, la programmazione con GUI multithread. Inoltre non richiede molta abilità specialistica (ad esempio, roba pesante di calcolo).

Quindi, scopri alcune informazioni per raschiare e iniziare l'hacking. Non dovresti impiegare molto tempo a fare qualcosa, sarà una dolce introduzione.


Sono d'accordo con un progetto, ma l'I / O di rete non è un buon caso d'uso per i thread. L'I / O senza blocco è più efficiente, utilizza meno risorse e soffre di meno condizioni di gara e casi d'angolo rispetto allo stesso problema risolto con i thread. Parte dell'apprendimento di essere un buon programmatore parallelo è riconoscere quando i thread non sono l'ideale.
Ben Voigt,

Potresti benissimo avere ragione, l'esperienza a cui mi riferivo era un raschiatura web di Python molto semplice in cui ho aggiunto circa 8 righe di codice per renderlo multithread. Dubito che sarebbe stato così facile farlo sincronizzare con il codice esistente, ma mi piacerebbe sapere se / come mi sbaglio. Penso che parte dell'apprendimento di essere un buon programmatore parallelo potrebbe essere quello di avere molta esperienza alle spalle, buona e cattiva :)
Henry,

0

Modella una semplice app Spy vs. Spy.

Ogni spia viene eseguita su un thread separato.

Ogni spia può infliggere danno all'altra spia, ma non direttamente.

Ogni spia può rubare risorse preziose dall'altra spia, ma non direttamente.

Entrambe le spie dispongono di un pool limitato di risorse e devono condividerle. Solo una spia può utilizzare una determinata risorsa alla volta.


0

In cima alla mia testa: la quarta edizione del libro di Bruce Eckel "Thinking in Java" ha un capitolo molto lungo sul threading (> 100 pagine - quasi un piccolo libro in sé). Ho letto edizioni precedenti del libro, e quindi non ho letto questo capitolo; ma ricordo uno dei suoi post sul blog (o le note di rilascio del suo libro), in cui afferma che scrivere questo è stato molto difficile e alla fine è stato un vero risultato per lui. Controlla...

A parte questo, c'è questo corso video di 2,5 ore su questo sito di formazione commerciale, ma puoi ottenere una prova gratuita (devi lasciare i dati della carta di credito; quindi non dimenticare di annullare l'iscrizione)

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading


0

Dovrei tornare alle origini e forse guardare alcuni testi di informatica sull'argomento?

Questa è sempre una buona scelta e ti consiglio di prendere un buon libro di discussione per familiarizzare con la discussione. Ho imparato il multithreading in Java e le conoscenze tradotte abbastanza facilmente in C #.

Se vuoi un esempio pratico, allora ti consiglio di provare il problema del filosofo da pranzo .

Devi imparare diverse cose quando stai entrando nel multithreading:

  1. I diversi modi per sincronizzare (semaforo, mutex, ecc.)
  2. Operazioni atomiche (in C # viene eseguita tramite Interbloccato per operazioni che non sono atomiche per impostazione predefinita).
  3. Programmazione concorrente senza blocco.
  4. Programmazione simultanea senza attesa.
  5. Discussioni, ThreadPools, BackgroundWorkers, ecc.

Non riesco a pensare ad altre cose al momento. Il tutorial di Albahari sembra davvero buono!


Sfortunatamente, cenare ai filosofi non è un problema utile. Ha lo scopo di essere una dimostrazione delle condizioni di gara, ma se effettivamente si verifichi lo stallo è soggetto ai capricci dello scheduler di sistema, ad altre attività, agli interrupt di processo ... in breve è del tutto indeterminato, e questo penso che non sia un buon posto per iniziare a imparare.
Ben Voigt,

1
@Ben Voigt, concordo sul fatto che il problema dei filosofi culinari non è deterministico, ma direi che neanche la maggior parte dei problemi di threading è deterministica. Quando ho partecipato a una lezione di programmazione concorrente è stato uno dei primi esercizi che abbiamo fatto, ora non sto sostenendo che l'insegnante avesse necessariamente ragione, ma era sicuramente uno dei migliori insegnanti che ho avuto e la sua capacità di spiegare e insegnare la concorrenza è stata superba. Il DPP dimostra solo un tipo di problema di concorrenza: deadlock. L'OP dovrebbe anche esaminare le condizioni di gara, il problema ABA e così via.
Kiril,

@Lirik: Certo, capisci il problema dei filosofi culinari. Ma non lo implementerei. Scrivere un codice sbagliato può diventare un'abitudine difficile da rompere.
Ben Voigt,

@Ben Voigt, scusami, mi devo perdere qualcosa: il punto del problema dei filosofi culinari è scrivere un programma che non si blocchi, quindi come risolvere il DPP richiederebbe la scrittura di "codice sbagliato"?
Kiril,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.