Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wielowatkowosc, sychronizacja miedzy watkimi
Forum PHP.pl > Inne > Hydepark
marcio
hej wiem ze byc moze sa inne fore gdzie moglbym o to zapytac ;p ale ogolnie jestem wierny php.pl wiele mu zawdzieczam ^^ i wiem ze sa tu ludzie ktorzy na pewno odpowiedza.

A wiec chodzi o wielowatkowosc.
Wczoraj dla zabawy zaczolem sobie robic aplikacje w C# for .net ktory pobiera rss'a z hacking.pl i zapisuje to do pliku w postaci xml'a i po przeparsowaniu w postaci txt jako news'y, mniejsza o to chodzi o to ze chcialem zobaczyc jak dziala progressbar wszystko by bylo fajnie gdyby nie to ze progressbar zaczyna dzialac dopiero gdy rss zostanie pobrany czyli "funkcje"(metody czy jakby to nazwac) nie dzialaja wspolbieznie lecz w kolejce FIFO dobrze mowie?I dopoki pierwsza kontrolka nie skonczy swojego dziala to progressbar sie nie bedzie aktualizowal.

No wiec doszlem do wniosku zeby pobawic sie watkami i w C# jak i w python'ie(green thread czyli tak jakby "emulowane" watki poprzez maszyne jesli dobrze skumalem) przy jakiejs prostej aplikacji siecowej albo jakims progsem w win forms.

Materialow jest duzo, jest dokumentacja i wszystko co tylko ze chce, jest to zagadnienie dosyc "szerokie" i nie nalezy do najlatwiejszych.O ile sama wielowatkowosc jest latwa do zrozumienia i zaimplementowania to juz gorzej jest z jej synchronizacja.

Potrzebuje jakis art'ow,tematow na forum w ktorych sa opisane roznice pomiedzy semaforami,mutexami,monitorami i lock'em o ile rozumiem idee ich dzialania to nie wiem zabardzo w jakim przypadku ktora z metod jest odpowiedniejsza, poprostu potrzebuje jakies porownanie na przykladach albo cos.

Z gory dziekuje.
mike
Cytat(marcio @ 15.12.2010, 13:26:16 ) *
zaczolem sobie robic progs w C#
Im więcej czytam i im starszy jestem tym mniejsza moja wyrozumiałość dla tego typu komunikatów.
Brak umiejętności poprawnego wysłowienia się to ułomność. A spychanie się w ułomność z własnej woli to już szczyt...

Wybacz ale takie coś można skomentować tylko w jeden sposób: bosch(e).
marcio
Cytat(mike @ 15.12.2010, 14:10:51 ) *
Im więcej czytam i im starszy jestem tym mniejsza moja wyrozumiałość dla tego typu komunikatów.
Brak umiejętności poprawnego wysłowienia się to ułomność. A spychanie się w ułomność z własnej woli to już szczyt...

Wybacz ale takie coś można skomentować tylko w jeden sposób: bosch(e).

No fajnie milo dla pana @mike'a bede pisal adekwatnie do sytuacji...

A co do tematu @mike?

Ok troche poprawilem, co do polskich znakow przepraszam ale na forach ich nie uzywam bo nie zawsze mam polska klawiature.
Cysiaczek
Chodzi o to ~marcio, że ktoś, kto rozumie zagadnienia poruszane przez Ciebie, nie będzie odpowiadał na taki post. Powiem więcej, pewnie nawet nie skończy go czytać.
Oprócz błędów, naliczyłem 10 wielokropków. Gdybyś to zredagował, to zapewne miałbyś większy odzew.

Pozdrawiam
Noidea
Polecam ten ebook - http://www.albahari.com/threading/ Wyczerpuje temat współbieżności w C# łącznie z nowinkami z tej dziedziny wprowadzonymi w .NET 4.0
Uważam, że warto przeczytać całość, ale możesz ominąć paragrafy które już znasz. O ile dobrze kojarzę, to w 2 części były porównania metod synchronizacji.


Natomiast jeśli potrzebne ci to jest wyłącznie do rzeczy typu aktualizacja ProgressBara, to nie używałbym niczego poza BackgroundWorkerem
marcio
Cytat
Natomiast jeśli potrzebne ci to jest wyłącznie do rzeczy typu aktualizacja ProgressBara, to nie używałbym niczego poza BackgroundWorkerem

No nie tylko do tego pobawil bym sie z aplikacjami siecowymi i zobaczy jak to dziala w praktyce w python'ie i C#, a sam backgroundworker z tego co sie orientuje to staroc z .net 2.0

Wlasnie wyczytalem ze .net 4.0 wprowadza duzo ulatwien np tutaj: http://www.pzielinski.com/?p=192 jednak ja pisze pod 3.5

Hmmm...ebook fajny szkoda tylko ze po angielsku o ile dokumentacja w tym jezyku to banal to jesli chodzi o tego typu artykuly mam juz problem, no ale zobaczmy co zdzialam.
erix
Cytat
Potrzebuje jakis art'ow,tematow na forum w ktorych sa opisane roznice pomiedzy semaforami,mutexami,monitorami i lock'em o ile rozumiem idee ich dzialania to nie wiem zabardzo w jakim przypadku ktora z metod jest odpowiedniejsza, poprostu potrzebuje jakies porownanie na przykladach albo cos.

http://wazniak.mimuw.edu.pl/index.php?titl...temy_operacyjne

Generalnie, to szukaj po materiałach uczelnianych, przedmiot Systemy Operacyjne.
Noidea
To że BackgroundWorker został wprowadzony w 2.0 i od tamtego czasu nie był zmieniany, nie musi od razu oznaczać, że jest przestarzały. Jest po prostu dobry (Proste problemy rozwiązuje się prostymi metodami). Właściwość String.length została wprowadzona w 1.0 a ludzie używają smile.gif

BW nie jest też związany z WinFormsami. To oddzielna klasa, którą równie dobrze można używać w WPF czy Silverlight.


thek
Artów jako takich nie mam. Rozumiem to "na chłopski rozum" winksmiley.jpg Semafor reguluje dostęp do zasobów nad jakimi czuwa. Może być binarny lub zliczający. Binarny oznacza po prostu czy do zasobu mogą się dostać procesy czy nie. Niezależnie ile ich jest. Zliczający to po prostu licznik. Jeśli dojdzie do zera, blokuje dostęp.
Mutex decyduje o dostępności do zasobu który nie może być dzielony i w jednej chwili może go używać tylko jeden proces.
Monitor jest już takim "sprytnym" semaforem. Ma możliwość wpuszczenia do zasobu procesu, ale jednocześnie jego metody się blokują, dzięki czemu w jednej chwili może obsługiwać jeden proces. To blokowanie zapewniają mu mutexy.

Podam przykład. Masz lotnisko i hangary oraz pasy startowe. Na pasie zawsze może być jeden samolot. W hangarze też. Na pasy oraz lotnisko jako całość zakładasz po jednym semaforze zliczającym. Informują one czy są wolne pasy i czy hangary na lotnisku także oraz ile wolnych jest. Na każdy hangar i pas zakładasz po monitorze. Informuje on o ich zajętości. Dzięki temu wiesz czy któryś jest zajęty. Przypuśćmy masz 1 pas i 3 hangary. Lądują naraz 2 samoloty. Monitor wpuszcza pierwszy i blokuje metodę "ląduj", by drugi nie próbował lądować w tym samym czasie. Gdy samolot kołuje już do hangaru semafor lotniska (ilość wolnych hangarów) obniżam o jeden, Monitor hangaru ustawiam na pobyt_tankowanie oraz informuje Monitor pasa, że ok. Zwalniam Mutex na metodzie ląduj. Ląduje kolejny samolot i to samo co wyżej. Oba siedzą w hangarach i ładują paliwko. Po jakimś czasie ląduje kolejny i znów historia. Teraz mam już wszystkie hangary zajęte więc lotnisko jest zablokowane i uważam co się dzieje w powietrzu, bo choć pasy mam wolne to wszystkie hangary pełne. Ok... Jeden samolot pełny i startuje. Mam więc wolny hangar i pas. Teraz czas na jaja... Lecą dwa samoloty naraz, a my mamy tylko jeden hangar. Co robimy? Semafor nic nam nie pomoże bo tylko liczy wolne miejsca. Puściłby w takim wypadku pierwszy, który trafi i tak jest najlepiej na razie. Pełne lotnisko blokuje zasoby współdzielone, czyli pas. Teraz dolatuje nasz drugi i sprawa się komplikuje. Każę mu kołować w powietrzu nad lotniskiem. Problem następuje gdy czas życia wątku jest określony i zaczyna on zgłaszać, że "kończy mu się paliwo". Semafor jest głupi. Nie zareaguje. Monitor i mutex są inteligentne. Monitor lotniska jest nam potrzebny! On może przyjmować warunki określone i decydować o tym co się dzieje na lotnisku. W takiej sytuacji mógłby on powiedzieć: "Te... Najlepiej zatankowany - spadaj nad lotnisko kołować lub leć gdzieś w cholerę na inne lotnisko, bo inaczej będziemy mieli katastrofę zaraz.". Sprawę można komplikować do postaci: 2 pasy - 1 hangar. Fajne, gdyż może jednocześnie samolot lądować, a inny startować zaś hangar jest wtedy na krótki okres wolny, ale trzeba uważać, by nie wbić 2 samolotów do jednego hangaru. Czyli metoda ląduj dla jednego pasa i jednego hangaru jednocześnie blokuje metodę ląduj innych pasów. Tak więc jest to świetne zadanie dla monitora całego lotniska by to kontrolował smile.gif Tak się najlepiej nauczyć co gdzie się stosuje. Stwórz sobie klasy:
Samolot (stan_paliwa, spalanie) i metodami: startuj(), ląduj(), tankuj_w_hangarze()
Pas (zajętość) i metodami: lądowanie(), start()
Hangar(zajętość) i metodami: zajmij(), tankuj(), wypuść()
Lotnisko(pasy, hangary) i metodami: lądowanie(pas, hangar), wylot(pas, hangar), awaryjne_lądowanie(), kołowanie_nad_lotniskiem()
i zacznij rozważać różne przypadki. Zaczniesz wtedy zauważać że semafor jest głupi i tylko pozwala lub nie na dostęp do wspólnych zasobów (na lotnisku liczy ile wolnych hangarów, nie musi wiedzieć które konkretnie), mutex po prostu blokuje dostęp do zasobu, który jest niepodzielny (pas czy hangar), a monitor to obiekt, który obsługuje wiele obiektów poprzez monitorowanie swoich zasobów. Zezwalając na pracę z jednym obiektem metodami, które blokują się poprzez zastosowanie mutexów. Zrób teraz sobie siatkę X lotnisk, Y samolotów, rozmieść na formatce i spróbuj pomiędzy nimi samolotów nie porozbijać winksmiley.jpg To klasyczne (oprócz filozofów) zadanie na studiach by załapać o co chodzi z synchronizacją wątków.
marcio
Cytat
Zrób teraz sobie siatkę X lotnisk, Y samolotów, rozmieść na formatce i spróbuj pomiędzy nimi samolotów nie porozbijać To klasyczne (oprócz filozofów) zadanie na studiach by załapać o co chodzi z synchronizacją wątków.

o0 wydaje mi sie to bardzo fajne rozwiazanie.
Chyba usiade do tego i spruboje, jednak nie wiem czy dam radezrobic taka rozpiske sam sie pogubie ;p

Ogolnie myslalem ze gdy zastosujemy juz jedna z opcji synchronizacji to nie powinno sie mieszac w to inne, ale z tego co ty opisujesz wynika ze kazdy "tryp" synchronizacji ma wyspecjalizowane zadanie.
Zyx
Od siebie dodam, że programowanie z "klasycznymi" prymitywami obsługi współbieżności bardziej skomplikowanych przypadków to zadanie trudne. Oczywiście zrobić to się da, ale analizowanie działania czegoś takiego (np. próby dowodzenia poprawności) nie ma najmniejszego sensu. Do weryfikacji używa się matematycznych modeli, a języki, które naprawdę dedykowane są zastosowaniom współbieżnym, w ogóle nie mają czegoś takiego, jak muteks czy semafor. W takim Erlangu procesy wysyłają sobie nawzajem komunikaty... i tyle, ale jakoś nie tylko da się w tym zrobić wszystko, co da się zrobić w Javie, ale da się to zrobić dużo prościej.
thek
Zyx. Komunikaty to także znane mi rozwiązanie. Chodzi mi o bibliotekę MPI dla C smile.gif Ale to już nie jest współbieżność. To już równoległość. Podobne, ale zgoła odmienne smile.gif

Co do "typów" marcio, to można je mieszać z prostej przyczyny. Są one jak klocki, które składają się w większą całość. To są jak wspomniał Zyx prymitywy,z których budujesz większą całość. Ich zakresy mogą się zazębiać. Jeśli nie zwróciłeś uwagi, to zobacz czym jest monitor. To klasa z metodami opartmi na mutexach. W chwili wywołania metody, żaden wątek do tej metody nie ma dostępu, aż do chwili jej zakończenia. Stąd właśnie monitor był ustawiony na pas. Na pasie w jednej chwili mógł tylko jeden samolot startować lub lądować. Ogólnie na lotnisku pas mógłby po prostu mieć mutex bo nieważne czy startuje czy ląduje coś - zajmuje pas, czyli zasób niemożliwy do współdzielenia przez kilka wątków jednocześnie. Ogólnie z semaforami masz do czynienia non-stop podczas pracy, nie wiedząc o tym. Przykładem jest dostęp do pliku. Otwarcie go do odczytu to semafor binarny. Taki plik może być odczytywany przez wiele wątków jednocześnie. Pomyśl jednak co się stanie gdy otworzysz go w trybie do zapisu. Jego odczyt będzie możliwy wciąż, ale żaden inny proces nie zostanie dopuszczony do zapisu. Nie mogą bowiem dwa procesy pisać do tego samego pliku. Będą się nawzajem nadpisywać w losowych miejscach, zależnie tóry kiedy bydostał dostęp.
batman
~marcio
MSDN Twoim przyjacielem. Jeśli chcesz poznawać C# i inne języki/technologie wchodzące w skład .NET, zacznij lekturę od wspomnianego serwisu. Na początek powinno wystarczyć to:
- http://msdn.microsoft.com/en-us/magazine/cc163328.aspx
- http://msdn.microsoft.com/en-us/library/ms741870.aspx
- http://msdn.microsoft.com/en-us/library/ms734701.aspx
Zyx
No widzisz, a ja nie mówię o MPI, tylko o matematycznym modelu współbieżności znanym jako Actor Model, który jest podstawą mechanizmu współbieżności w Erlangu i nie tylko.
Theqos
@thek
"Erlangowa współbierzność" w bardziej przystępnym języku http://www.scala-lang.org/node/242
marcio
No widze ze kazdy proponuje cos innego winksmiley.jpg
No nic zobacze co tam zrozumie i dam rade zrobic w C#/pythonie jak bedzie czas
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.