Wątki - jak to "ładnie" zrobić w pętli for?

0

Krótki opis aplikacji.
Pracuje jako usługa i coś tam sobie liczy.
Chcę aby to robiła na dwa wątki.
test4 klasa i test44 funkcja która odpowiada za obliczenia.

for (int i = 0; i < 2; i++)
            {
                t1 = new Thread(new ThreadStart(new test4().test44);
                t1.Start();
            }

Pytanie.
Jeśli dobrze rozumiem, w pierwszej linii for utworzę dwa obiekty klasy test4, oraz dwa wątki.
Czy przy takim sposobie utworzenia wątku jestem w stanie sprawdzać który z dwóch utworzonych wątków jeszcze pracuje - coś na kształt t1.IsAlive... tyle że tu pod t1 kryją się dwa wątki :(
I drugi problem - jak dostać się do utworzonych obiektów test4 - np pola publicznego przechowującego wynik obliczeń czy innych parametrów.

Jedyne co widzę to utworzenie obiektów klasy test4 jawnie (obiekt_test4 = new test4()), i utworzenie dwóch wątków (t1,t2), czego wolałbym uniknąć, gdyż jeśli procesor będzie zajęty to drugi wątek nie będzie uruchamiany.

0

Odpowiem na pierwsze pytanie - w tej sytuacji za drugą iteracją stracisz referencję do pierwszego wątku.. bo wskaźnik "t1" wskazuje już na drugi wątek. Możesz się posłużyć tablicą wątków Thread[] aby rozwiązać twój problem.

..a tak w ogóle to popraw temat wątku, bo zaraz cały temat poleci do kosza..

0

Deti o tablicy nawet nie pomyślałem - dlaczego ją wykluczyłem... nie potrafię wytłumaczyć, być może sugestia artykułów na temat wątków jakie czytałem i w żadnym się na takie rozwiązanie nie natknąłem... Jutro się nad tym spokojnie zastanowię - ale już serdecznie dziękuję :)

a za poprzedni temat przepraszam, ale naprawdę nie miałem (nadal nie ma pojęcia) jak trafnie i krótko nazwać to czego szukam - trudno nazwać nieznane ;(

0

Po co w ogóle kombinujesz? Rozumiem tablicę przy 16 wątkach do jakichś ogromnych obliczeń na ogromnych maszynach, ale dwa?

var t1=new Thread(...);
var t2=new Thread(...);

i tyle.

0

Azarien to już przerabiałem, ale nie podobało mi się ze względu na ewentualną przyszłą rozbudowę. Obliczenia będą dość skomplikowane - sieć neuronowa.
Wydawało mi się(może wciąż wydaje) że będzie mi prościej to oprogramować - nie zawsze drugi wątek będzie dodawany (zależeć to będzie od pory dnia, ilości zadań i obciążenia procesora), wątki będę uruchamiane oczywiście z różnymi parametrami itd.
Tak czy siak nie upieram się - szukam różnych rozwiązać by być elastycznym ;)

Wracając do drugiego problemu z odwołaniem się do tak (jak w moim kodzie pętli) utworzynych obiektów to też nic nie stoi na przeszkodzie by zrobić podobnie jak z wątkami, a mianowicie też stworzyć tablicę.

Dzięki wszystkim za pomoc i wskazówki - jeśli ktoś jeszcze chciałby coś podpowiedzieć/dodać chętnie przeczytam.

0

Dopowiem coś :) .. jeśli robisz sieć neuronową, gdzie moc obliczeniowa procesora będzie prawie całkowicie pochłaniana przez obliczenia (korekta wag itd..), to dodaniu wielu wątków nic tu nie pomoże, a nawet obliczenia będą wolniejsze..

0

Deti to sobie sprawdziłem i na moim niezbyt szybkim mobilnym 2x1,8GHz, jeden proces nauki pobiera ~50% mocy. Jak wspomniałem - drugi wątek wystartuje tylko wtedy gdy procesor nie będzie obciążony, a całość nauki ma odbywać się w godzinach nocnych przy małym obciążeniu serwera. Dodam też, że odpalając dwa wątki u siebie zawsze był wymierny zysk czasowy. Z racji, że obiektów do nauki będzie sporo 100-200, a sama nauka też do najkrótszych nie należy (nie zawsze też idzie się nauczyć z założynym progiem i wtedy trzeba naukę powtarzać, zmieniać parametry sieci itd.) to każdy zysk większy od 10% jest dla mnie cenny :)

0
Deti napisał(a)

Dopowiem coś :) .. jeśli robisz sieć neuronową, gdzie moc obliczeniowa procesora będzie prawie całkowicie pochłaniana przez obliczenia (korekta wag itd..), to dodaniu wielu wątków nic tu nie pomoże, a nawet obliczenia będą wolniejsze..

Jeśli procesor jest wielordzeniowy, to pomoże i to bardzo wiele.

0

Drugi rdzen pozera system, przeciez tez dziala ;) Nigdy nie jest tak, ze nic nie robi.

0

Bez przesady, system to może i pożera z 3% obu rdzeni, więc sporo zapasu zostaje. Na SN się nie znam, ale obstawiam, że tak czy siak to się daje zrównoleglić.

0

Niewazne ile procent, ale zajmuje. Jak masz 2 rdzenie to jeden moze robic jedna rzecz, a drugi druga. Jak system przelacza konteksty to cos robi - znaczy co najmniej jeden jest zajety, choc nie idzie na 100% mozliwosci.

0

System wszak przydziela każdemu procesowi pewien czas, jeśli jeśli zaś wiekszość nie robi nic, to podejrzewam, że system przydziela czas na krócej albo rzadziej (nie sądzę, żeby tylko i wyłączonie kierował się priorytetem, a nawet jestem pewien, że tego nie robi - oczywiście mówię o systemach rodziny windows). Wnioskuję z tego (co popieram obserwacją i testami), że uruchomienie dwóch wątków, gdzie każden z wątków zajmuję się liczeniem (siecią neuronową) dla innego przypadku wymiernie skraca czas wykonywania, oczywiście zakładając, że żaden inny proces nie podbiera zasobów systemowych. Sieć, z której korzystam jest jednowątkowa - jeden proces nauki korzysta tylko z jednego rdzenia - drugi się nudzi. Spadek wydajności można by zanotować, gdyby sieć neuronowa korzystała z obu rdzeni, albo gdyby uruchomić kilka (lub kilkanaście) wątków - wtedy zbyt dużo czasu system traciłby na przełączanie kontekstów, a przy dwóch rdzeniach i tylko dwóch wątkach zajmujących dużo czasu procesor te dwa wątki rzadziej wywłaszcza, bo nie potrzebuje wykonać innej pracy - co podkreślam nie oznacza, że wcale ich nie wywłaszcza!

1 użytkowników online, w tym zalogowanych: 0, gości: 1