Nowy wątek vs nowy proces

Nowy wątek vs nowy proces
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
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.

EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
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.

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
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

EM
Może rozwiniesz myśl pod pierwszym komentarzem? W sensie że śmiejesz się z tego że zarządzanie procesami jest łatwiejsze czyli masz o tym pojęcie więc proszę napisz coś więcej.
n0name_l
Ale co tu rozwijac? Masz do wyboru 2 rzeczy, w jednej masz pamiec dzielona, mozliwosc przekazywania komunikatow i mechanizmy synchronizacji wbudowane w biblioteke standardowa, a druga to osobny proces.
EM
No to już wiemy. Ale czy podprogram w osobnym procesie może być alternatywą dla pisania tej samej funkcjonalności w jednym programie w osobnych wątkach? Czy mam rację że użycie procesów jest łatwiejsze / bezpieczniejsze?
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
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.

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
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.

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
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.


░█░█░█░█░█░█░█░█░█░█░█░
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
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ę ;)

WI
Takie szybkie pytanko, czy nie można zrobić tego co napisałeś również na wątkach? Uruchamiasz wątek i czekasz na wynik, lub na wyjątek/inną formę. Wydaje mi się że jest to również możliwe, i także dużo prostsze, zwłaszcza jeśli stwierdzisz że fajnie by było mieć jednak pamięć dzieloną.
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.