Home > C# > [PL] Wielowątkowość pułapki i haczyki w C#

[PL] Wielowątkowość pułapki i haczyki w C#

February 22, 2014 Leave a comment Go to comments

ThreadsParę dni temu, a dokładniej 12 lutego miałem przyjemność poprowadzić spotkanie, na Trójmiejskiej Zawodowej Grupie .NET. Poruszyłem na nim parę tematów związanych z coraz bardziej popularnym programowaniem wielowątkowym, czy też jak niektórzy mówią – współbieżnym. Niestety czasu na prezentacji było mało, a tematyka jest spora i ciekawa. Dlatego wydaje mi się, że warto ten temat zgłębić i wyjaśnić parę haczyków, które mogą na pierwszy rzut oka nie być takie oczywiste. Na początek jednak parę podstaw i link do przykładów.

Co udało się poruszyć na spotkaniu?

Niewiele. Na początek parę pułapek i wyjaśnienie jak działa async i await, potem poszły w ruch Taski oraz parę locków i volatileów. Na koniec przyjrzeliśmy się między innymi instrukcji lock (patrząc co się kryje pod tą instrukcją) oraz wspomniałem na temat wyjątków, które mogą rozwalić nam aplikację w czasie działania. Wszystko oparte było na przykładach, które dostępne są na githubie. W wolnym czasie postaram się je jeszcze bardziej dopieścić i udokumentować, a co niektóre bardziej opisać w osobnych postach.

Wątek od strony użytkownika.

Dzisiejszy programista bez znajomości zasad i problemów związanych z wątkami, jest jak programista bez klawiatury, jedynie z myszką, którą może coś wyklikać. Wykorzystanie mocy komputerów, ich rdzeni to taki ‘must know‘. Warto jednak uważać, aby nie przeginać z wątkami. Bywa tak, że tworzy się wątki albo wykorzystuje pulę wątków na maxa nie interesując się tym za bardzo co się dzieje dalej. Dotyczy to przede wszystkim aplikacji destopowych, gdzie trzeba uważać na zasoby komputera.

Real BAD example: otwieram okno na którym wyświetlam użytkownikowi listę zdjęć z miniaturkami. Miniaturki znajdują się na serwerze, wobec tego muszę je ściągnąć – żeby ‘przyspieszyć’ działanie aplikacji, niech każde zdjęcie ładuje się osobno i jednocześnie. Zatem jak mamy 10 zdjęć, to utwórzmy 10 wątków lub wykorzystajmy całą pulę. Niestety takie podejście ‘na łatwiznę’ i może wyrządzić więcej szkód niż korzyści.

Dlaczego trzeba uważać na wątki ?

Zastanawiałeś się czemu Windows Tobie zamula, a raczej zapycha pamięć? Otwórz sobie menedżera zadań i spójrz ile masz ‘działających’ wątków. Ja na moim komputerze mam na starcie ponad 1000.

Zasoby

Co gorsze, CPU jest praktycznie niewykorzystane i te 1000 wątków sobie tak siedzi, nic nie robi i tylko zajmuje pamięć. Należy pamiętać, że jeden wątek na start potrzebuje lekko ponad 1MB pamięci. Wobec powyższego przykładu 1GB ramu jest w większości zajęte dla ‘nic nierobienia’– szkoda.

Jak rozwiązać ten problem?

Nie jest to łatwe. Wielu programistów z chęcią wykorzystuje klasę Thread lub z chęcią sięga do puli wątków, lub po prostu tak działa dana kontrolka. Dla przykładu otwórz sobie notatnik i zerknij na liczbę wątków wykorzystanych przez niego. Następnie kliknij w ikonę otwórz i zobacz co się stanie (Ja mam zamienionego notatnika na notepad2, jednak problem jest ten sam). Liczba wątków zwielokrotniła się. Zauważyć to można nawet w prostych aplikacjach, które wykorzystują systemowe okno dialogowe dla wskazania pliku.

Notepad and threads

W rezultacie, w aplikacjach Windows Store, nie znajdzie się klasy Thread. Programista jest ‘ograniczony’ jedynie do Tasków (które i tak wewnętrznie wykorzystują wątki). Microsoft jednak ewidentnie pozbył się klasy Thread i sugeruje uzycie async/await oraz Task – jednak szczegóły oraz pułapki związane z nimi omówię w kolejnych postach.

Tags: ,
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: