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:ponad 4 lata
  • 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:ponad 4 lata
  • 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:ponad 4 lata
  • 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:5 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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)