Nowy wątek vs nowy proces

0

Cześć,
piszemy aplikacje która wykonuje różnego rodzaju wyszukiwania, przetwarzanie obrazów, kompresje i operacje na bazie danych. Teraz żeby każda z tych operacji mogła być całkowicie niezależna, wykonywała się możliwie najszybciej i aby nie powodowała zamrażania całej appki na bliżej nieokreślony czas chcemy każdą z tych funkcjonalności puszczać w osobnym wątku.

Pytanie czy stworzenie dla tych "największych" funkcjonalności osobnego podprogramu a później wywoływanie go z programu głównego przekazując mu parametry i odbierając zwracaną wartość nie jest jakąś alternatywą? Na pierwszy rzut oka wydaje się to prostsze do napisania / utrzymania bo mam całą funkcjonalność podzieloną na moduły. Co o tym myślicie?

0

Jedyna sluszna odpowiedzia jest - to zalezy. Jezeli ta aka to porgram desktopowy to wynik zleconej operacji powinien byc zwrocony do uzytkownika jak najszybciej, czyli przenosimy do osobnego watku tylko to co moze przyblokowac GUI. Jezeli zrobisz calkowicie asynchroniczna aplikacje to pojawia sie problem jak odpowiednio zwrocic rezultat albo informacje o bledzie bedac swiadomym ze uzytkownik mogl w czasie wykonania jednej operacji zlecic nastepna. A co jesli wykonanie operacji jednego typu ma wplyw na inna? Trzeba zaczac blokowac zasoby noi dodatkowo uzytkownik moze dostac nieprawidlowe wyniki.

0

Dzięki za odpowiedź ale uściślijmy pewne rzeczy bo dalej nie wiem czy to co chce zrobić to dobry pomysł.

czyli przenosimy do osobnego watku tylko to co moze przyblokowac GUI

ok, ale drugim powodem dla którego chciałem rozbić zadania na więcej wątków jest też wydajność / szybkość - zda to egzamin?

Każdy podprogram sam zarządzałby swoją obsługą błędów, ja musiałbym "tylko" przekazać mu np zdjęcie do kompresji i "odebrać" wynik. W przypadku błędu wywala się tylko podprogram a nie cała aplikacja.... ?

W przypadku pisania tego w jednym programie i rozbijania na wątki wydaje mi się że bardzo trudno było by mi napisać taki kod - synchronizacja, blokady... W tym temacie dopiero raczkuje a czytałem już kilka razy od "starszych stażem" że C++ nie sprzyja pisaniu aplikacji wielowątkowych...

1

Jezeli chcesz zrobic taka apke to zrob, wtedy poznasz wady i zalety takiego rozwiazania :) Zysk na wydajnosci bedzie taki, ze bedziesz mogl zlecic kilka operacji naraz.

Jesli chodzi o watki w C++ to czasami mam wrazenie ze zarzadzanie wieloma procesami jest latwiejsze. Nie znam zadnych dedykowanych frameworkow dla tej technologi do zarzadzania watkami jak to jest np w javie.

Nie znam boost'a, ale qt bardzo latwo mozna uruchomic zewnetrzna aplikacje, a przesylanie komunikatow odbywa sie sygnalami i slotami.

1

wieloma procesami jest latwiejsze.

:D

Nie znam zadnych dedykowanych frameworkow dla tej technologi do zarzadzania watkami jak to jest np w javie.

std::thread :D

0

Ale czy podprogram w osobnym procesie może być alternatywą dla pisania tej samej funkcjonalności w jednym programie w osobnych wątkach?

Pewnie. Tak samo jak kartka i dlugopis moze byc alternatywa dla nowoczesnych IDE.

Czy mam rację że użycie procesów jest łatwiejsze?

Latwiejsze jest tylko w przypadku, gdy mamy gotowa aplikacje i chcemy cos z nia zrobic, patrz tmux.

/ bezpieczniejsze

Dla kogo/czego i jak bezpieczniejsze, bo nie lapie tej kwestii akurat? Chronisz sie przed kims/czyms/zmasowanym atakiem hakjerjow z calej polkuli? Czy chodzi o bezpieczenstwo typu nie walne faila i mi program nie bedzie sie crashowal w losowych momentach?

Jesli to pierwsze, to tak uzycie procesow jest bezpieczniejsze, tzn. daja wiecej mozliwosci.
Jesli to drugie, to zalezy.

Co do twojego przypadku to po prostu naucz sie obslugi watkow czy to tych z std, czy z Qt, czy whatever i to napisz.

0

Piszac framework mialem na mysli narzedzie zblizone do akki w javie. Std::thread to dosc proste rozwiazanie opakowujace rozwiazania natywne tak jak jestto zrobione w qt czy boost.

0

http://www.theron-library.com/ pierwsza lepsza z brzegu implementacja tego modelu. Zapewne nie siega zbytnio akka do piet, ale po prostu w C++ sie nie da zrobic pewnych rzeczy i tyle.

2

Jeśli działa to na tym samym komputerze to lepiej wątki, jeśli na kilku różnych to nie masz wyjścia i musisz osobny proces odpalić. Dane przekazujesz używając np. named pipes (działa też po sieci) albo jak w wątku to możesz bezpośrednio.

0

Dla kogo/czego i jak bezpieczniejsze, bo nie lapie tej kwestii akurat?

Jeżeli każdy moduł odpowiada za siebie ( sprawdza wejście / wyjście, zawiera obsługę błędów itp ) to główna apka wywołuje kolejne moduły / procesy i zleca im określone zadanie nie przejmując się tym co dzieje się w tamtym procesie - interesuje ją tylko wynik i albo go dostaje albo dostaje wyjątek mówiący że coś poszło nie tak i może spróbować uruchomić go jeszcze raz lub nie.

Plusy jakie wydaje mi się mogą wystąpić to mniej skomplikowany kod głównego programu i łatwiejsze zarządzanie / rozbudowa o kolejne moduły.

Dzięki wszystkim za odpowiedzi i do @n0name_l - wszystko co piszę w tym temacie traktuj jak pytania, bo jeśli chodzi o wielowątkowość dopiero raczkuje i na pewno wezmę się za jej naukę ;)

1

Nie ma sensu definiować nowego procesu/wątku per nową funkcjonalność (co nie oznacza, że nie warto zrównoleglać samych modułów, ofx o ile to możliwe i rozsądne).
Na pewno warto puścić GUI w osobnym wątku. Dla podziału zadań możesz użyć np. puli wątków.

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