🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #334574

Re: Wolno działające wątki ...

#334574
From: Arivald
Date: Tue, 03 Jan 2012 15:39
57 lines
3807 bytes
W dniu 2012-01-03 15:27, DK pisze:
> Witam.
>
> Ostatnio trochę się bawiłem przetwarzaniem bitmap i coś mnie mocno
> zdziwiło. Ale po kolei
>
> Napisałem prostą funkcję przepuszczająca bitmapę przez filtr
> dolnoprzepustowy i wszystko działało ładnie. Bitmapy się generowały i
> było pięknie.
> Jednak samo przetwarzanie nie było jakoś specjalnie szybkie. Przeniosłem
> kod do wątku a w zasadzie tworzy się kilka wątków. W zależności od
> potrzeb jest to definiowane. Jednak coś jest nie tak.
> Gdy odpalony jest jeden wątek to przetwarzanie działa z grubsza tak jak
> przed przeróbką. Jednak gdy wątków jest więcej to całość działa
> kilkukrotnie wolniej. Zastanawiam się co jest tego przyczyną ?
> Wykombinowałem, że może chodzi o konflikt zasobów. Wszystkie wątki
> odwoływały się do tych samych obiektów TBitmap i macierzy (tablic) z
> definicją filtra. Więc rozdzieliłem je. Każdy z nich pracuje na swojej
> kopii fragmentu bitmapy i swojej lokalnej wersji macierzy. Na końcu
> całość jest składana do kupy. Jednak dalej działanie aplikacji
> wielowątkowej jest wolniejsze niż pojedynczego wątku przetwarzającego
> bitmapę. Prawdopodobnie błąd jest w moim toku myślenia, a może chodzi o
> jakieś zarządzanie wątkami ?
>
> I jeszcze jedno. Pojedynczy wątek obciąża mi procesor w 50% *(mam 2
> rdzeniowca) za to gdy są 2 wątki to obciążenie spada do ok 25%. Gdzie
> mogę robić błąd ? Będę wdzięczy za wszelkie pomysły. A może polecicie
> jakiegoś tutoriala opisującego poprawne działanie aplikacji wielowątkowych.
>
> Z góry dzięki za info.

Widać wątki się nawzajem blokują na sekcjach krytycznych czy semaforach, 
czy co tam używasz do synchronizacji. Mam nadzieję że nie jest to 
Thread.Synchronize()?

Bitmap.Canvas.Lock blokuje dostęp do canvasa bitmapy sekcją krytyczną. 
Tylko jeden wątek na raz da radę jej użyć. A bez Locka operacje na 
bitmapach w wątku są niebezpieczne (AV i inne cuda).

Najlepszy model to taki w którym wątek dostaje całe zadanie dla siebie i 
nie musi nic współdzielić.

To znaczy że na pewno musi mieć prywatną bitmapę wyjściową.
Potem łączysz takie bitmapy blitując je do jednej większej.
Układ koordynatów na każdej małej bitmapie (nazwijmy ja kafelkiem) można 
zmienić tak że zapisujący wątek będize się posługiwał takimi samymi 
koordynatami jak przy zapisie do dużej mapy. Jednocześnie pozwoli Ci to 
na dość płynną zmianę rozmiaru kafelka bez modyfikacji kodu.

Dane wejściowe, jeśli są stałe mogą być współdzielone. Ale dane które są 
zmieniane muszą być albo prywatne dla wątku (najlepiej) albo 
synchronizowane (sekcją krytyczną). Ewentualnie 
TMultiReadExclusiveWriteSynchronizer, pozwoli na jednoczesne czytanie 
wielu wątkom, przy atomowym zapisie.

-- 
Arivald
Technical Details
Message-ID: <jdv7g8$9us$1@news.dialog.net.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail
References: <jdv38v$4kr$1@inews.gazeta.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail
From: Arivald <arivald_@AT_interia_DOT_.pl>
Newsgroups: pl.comp.lang.delphi
Subject: Re: Wolno działające wątki ...
Date: Tue, 03 Jan 2012 16:39:54 +0100
Organization: Dialog Net
Lines: 57
Message-ID: <jdv7g8$9us$1@news.dialog.net.pl>
References: <jdv38v$4kr$1@inews.gazeta.pl>
NNTP-Posting-Host: poczta.pgs-soft.com
Mime-Version: 1.0
X-Trace: news.dialog.net.pl 1325605192 10204 62.87.249.67 (3 Jan 2012 15:39:52 GMT)
X-Complaints-To: abuse@dialog.net.pl
NNTP-Posting-Date: Tue, 3 Jan 2012 15:39:52 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:9.0) Gecko/20111222 Thunderbird/9.0.1
In-Reply-To: <jdv38v$4kr$1@inews.gazeta.pl>
X-Stationery: 0.7.7
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit