Czy ktoś może mi zaproponować projekt, który pomoże mi zrozumieć wątki

13

Obecnie jestem programistą C # z dość chwiejnym rozumieniem wątków.

Oba te linki zostały zasugerowane w innych postach:

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

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

Czy powinienem wrócić do podstaw i może zajrzeć do niektórych tekstów informatyki na ten temat?

Naprawdę czuję, że jeśli wskoczę i użyję bibliotek c #, tak naprawdę nie będę miał solidnych podstaw wiedzy, na których można by budować. Myślę, że muszę nauczyć się tego tematu od zera jak studentka science fiction, a następnie użyć bibliotek C #.

Czy ktoś może zasugerować podejście do nauki wątków, może jakieś linki i / lub pomysły na projekty?

Z góry dziękuję!

Edytuj, dziękuję za wszystkie odpowiedzi. Niektórzy wspominali, że książka może być dobrym pomysłem, czy ktoś może ją zasugerować? Wolałbym coś agnostycznego z języka. Czy ktoś wie, w jakiej klasie byłyby omawiane te przedmioty na kierunku informatyka? Próbuję znaleźć w Google kilka darmowych notatek i zadań online.

bplus
źródło
Nie wiem, czy to pomaga, ale jest to prosty tutorial, który napisałem w VB.Net jakiś czas temu, który wyjaśnia podstawową koncepcję wątków. Powinieneś być w stanie łatwo przekonwertować go do C #. chrishaas.wordpress.com/2009/06/25/…
Chris Haas
Mam silną pokusę, by zasugerować napisanie wielowątkowego interfejsu GUI, ponieważ nauczyłby on granic tego, co można zrobić z wątkami i pozostawał przy zdrowych zmysłach. Ale to nie byłoby konstruktywne, więc pozwolę mu jeździć jako komentarz, a nie odpowiedź… :-)
Donal Fellows

Odpowiedzi:

3

Napisz wielowątkowy serwer WWW. Nauczysz się TON . I to nie tylko wątki.

Grandmaster B.
źródło
4

Problem producenta i konsumenta jest klasycznym przykładem i pomaga zrozumieć nie tylko wątki, ale także planowanie procesorów (można to zademonstrować za pomocą fork () dla procesów potomnych w przeciwieństwie do wątków) oraz tego, w jaki sposób twoje programy współdziałają z systemem operacyjnym za nimi sceny.

Oto podsumowanie ważnych rzeczy, które powinieneś zrozumieć w zakresie wątków / rozwidlenia 1. Jak system operacyjny planuje zadania (na przykład algorytm Round Robin) 2. Blokowanie zasobów (Jeśli wiele wątków korzysta z tego samego zasobu, nie chcesz, aby mieć do nich dostęp w tym samym czasie - BAD THINGS HAPPEN)

Oto artykuł wiki na temat tego klasycznego problemu: http://en.wikipedia.org/wiki/Producer-consumer_problem

Zasadniczo utwórz „Producenta”, który odradza wątki „Konsumentów”. Producent wytwarza „zasób”, a konsumenci go konsumują. Umieść go w pętli i obserwuj, co się stanie (zdziwisz się, że ostatecznie konsumenci zużyją więcej zasobów niż są dostępne z powodu niezsynchronizowanych metod).


źródło
Interesujące, wydaje się, że ustawiłem ten wzór, nie zdając sobie z tego sprawy podczas tworzenia wątkowej usługi Windows. Twój opis był idealny. Dobrze wiedzieć, że prawie na pewno oznaczałoby to odpowiedź na moje otwarte pytanie.
Tony,
2

Wybierz jeden z klasycznych wysoce równoległych problemów. Bardziej interesujące może być wybranie takiego z super-liniowym przyspieszeniem.

Rozważ przeszukanie nieposortowanej i nieindeksowanej listy. Ten problem jest trywialnie równoległy. Najpierw zaimplementuj wyszukiwanie jednowątkowe, a następnie naiwne wyszukiwanie równoległe. Wdrożenie kradzieży pracy. Wygeneruj losowe zestawy danych i uruchom wszystkie trzy wersje na tych samych zestawach danych. Oblicz przyspieszenie.

Ben Voigt
źródło
0

Nie sądzę, żeby podręcznik był kolejnym najlepszym krokiem. Projekt jest do zrobienia. To powinno być coś, co Cię ekscytuje.

Za pierwszym razem, gdy robiłem wątki, poprawiałem wydajność przeszukiwacza sieci. Możesz czołgać się o wiele szybciej, jeśli nie wykonujesz całego sieciowego IO szeregowo. Jest to świetny projekt na początek, ponieważ można podejść do niego na kilka sposobów, ale nie jest to tak skomplikowane, jak, powiedzmy, wielowątkowe programowanie GUI. Nie wymaga również specjalistycznych umiejętności (na przykład ciężkich obliczeń).

Więc znajdź trochę informacji do zeskrobania i zacznij hakować. To nie powinno zająć dużo czasu, aby coś zacząć, będzie to delikatne wprowadzenie.

Henz
źródło
Zgadzam się z projektem, ale sieciowe operacje we / wy nie są dobrym przykładem użycia wątków. Nieblokujące We / Wy jest bardziej wydajne, zużywa mniej zasobów i cierpi z powodu mniejszej liczby warunków wyścigu i przypadków narożnych niż ten sam problem rozwiązany za pomocą wątków. Częścią nauki dobrego bycia programistą równoległym jest rozpoznawanie, kiedy wątki nie są idealne.
Ben Voigt
Być może masz rację, doświadczenie, o którym mówiłem, było bardzo prostym przeglądaniem stron w Pythonie, gdzie dodałem około 8 linii kodu, aby był wielowątkowy. Wątpię, czy tak łatwo byłoby to zrobić asynchronicznie z istniejącym kodem, ale chciałbym wiedzieć, czy / jak się mylę. Myślę, że częścią nauki bycia dobrym programistą równoległym może być posiadanie dużego doświadczenia za pasem, dobrze i źle :)
Henry
0

Modeluj prostą aplikację Szpieg kontra Szpieg.

Każdy szpieg działa w osobnym wątku.

Każdy szpieg może wyrządzić szkody drugiemu szpiegowi, ale nie bezpośrednio.

Każdy szpieg może ukraść cenne zasoby od drugiego szpiega, ale nie bezpośrednio.

Obaj szpiedzy mają do dyspozycji ograniczoną pulę zasobów i muszą je dzielić. Tylko jeden szpieg może korzystać z dowolnego zasobu jednocześnie.

Mike Hofer
źródło
0

Z góry mojej głowy: 4. wydanie książki Bruce'a Eckela „Myślenie w Javie” zawiera bardzo długi rozdział na temat wątków (> 100 stron - prawie sama książka). Przeczytałem starsze wydania książki, więc nie przeczytałem tego rozdziału; ale pamiętam jeden z jego postów na blogu (lub informacje o wydaniu jego książki), w którym twierdzi, że napisanie tego było bardzo trudne i ostatecznie było to dla niego prawdziwe osiągnięcie. Sprawdź to...

Oprócz tego na tym komercyjnym serwisie szkoleniowym znajduje się 2,5-godzinny kurs wideo, ale możesz uzyskać bezpłatną wersję próbną (musisz zostawić dane karty kredytowej, więc nie zapomnij zrezygnować z subskrypcji)

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

knb
źródło
0

Czy powinienem wrócić do podstaw i może zajrzeć do niektórych tekstów informatyki na ten temat?

To zawsze dobry wybór i polecam wybrać dobrą książkę do wątków, aby zapoznać się z wątkami. Nauczyłem się wielowątkowości w Javie i wiedza dość łatwo przełożyła się na C #.

Jeśli chcesz praktycznego przykładu, polecam spróbować problemu z filozofem kulinarnym .

Musisz nauczyć się kilku rzeczy, gdy zaczynasz korzystać z wielowątkowości:

  1. Różne sposoby synchronizacji (semafor, muteks itp.)
  2. Operacje atomowe (w języku C # odbywa się to za pomocą Interlocked dla operacji, które domyślnie nie są atomowe).
  3. Programowanie równoległe bez blokady.
  4. Równoczesne programowanie bez czekania.
  5. Wątki, ThreadPools, BackgroundWorkers itp.

W tej chwili nie mogę myśleć o innych rzeczach. Samouczek Albahari wygląda naprawdę dobrze!

Kiril
źródło
Niestety, filozofowie kulinarni nie są użytecznym problemem. Ma to być demonstracja warunków wyścigu, ale to, czy rzeczywiście nastąpi impas, zależy od kaprysu harmonogramu systemu, innych zadań, przerw sprzętowych ... krótko mówiąc, jest to całkowicie nieokreślone i myślę, że nie jest to dobre miejsce zacząć naukę.
Ben Voigt
1
@Ben Voigt, zgodziłbym się, że problem filozofów żywienia jest niedeterministyczny, ale powiedziałbym, że większość problemów z wątkami też nie jest deterministyczna. Kiedy brałem udział w równoczesnych zajęciach z programowania, było to jedno z pierwszych ćwiczeń, które zrobiliśmy, teraz nie twierdzę, że nauczyciel miał rację, ale z pewnością był jednym z najlepszych nauczycieli, jakich miałem, i jego zdolnością do wyjaśniania i nauczania współbieżność była znakomita. DPP demonstruje tylko jeden rodzaj problemu współbieżności: zakleszczenie. OP powinien również przeanalizować warunki wyścigu, problem ABA i tak dalej.
Kiril
@Lirik: Jasne, zrozum problem filozofów kulinarnych. Ale nie wdrożyłbym tego. Pisanie złego kodu może stać się trudnym nawykiem do zerwania.
Ben Voigt
@Ben Voigt, przepraszam, muszę coś przeoczyć: sedno problemu filozofów kulinarnych polega na napisaniu programu, który nie ma impasu, więc jak rozwiązanie DPP wymagałoby napisania „niewłaściwego kodu”?
Kiril