• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak programować aplikacje wielowątkowe?

VPS Starter Arubacloud
0 głosów
1,255 wizyt
pytanie zadane 8 maja 2017 w C i C++ przez Blacha Mądrala (5,960 p.)
Witam,

ostatnio pracuję nad serwerem do aplikacji internetowych. W takim projekcie wielowątkowość raczej jest nieunikniona. No i przez to mam mętlik w głowie, jak ma wyglądać struktura/zarys serwera? Mam zerowe doświadczenie z wielowątkowością i nie wiem co powinno się stosować, czego unikać, jakie są dobre nawyki a jakie złe.

Ogólnie to moją obecną ideą są 3 wątki które pracują niezależnie, w sensie nie ma jakiegoś punktu w którym dochodziłoby do ich synchronizacji (oczekiwania na zakończenia danych wątków). I nie wiem czy przypadkiem to nie jest jakiś karygodny błąd. Oczywiście zadbałem o to aby dane wykorzystywane przez parę wątków miały "blokadę" na czas operowania na nich.

I jeszcze dopytam, czy korzystanie z jednego obiektu przez parę wątków to nic złego czy raczej unika się tego?

Proszę o osoby które mają doświadczenie z programowaniem wielowątkowych o podzielenia się dobrymi, a przede wszystkim najważniejszymi radami i zasadami z tej dziedziny. Myślę że nie tylko mi się to przyda.

2 odpowiedzi

0 głosów
odpowiedź 8 maja 2017 przez Evelek Nałogowiec (28,960 p.)

I jeszcze dopytam, czy korzystanie z jednego obiektu przez parę wątków to nic złego czy raczej unika się tego?

Podstawowa zasada:

Współbieżne działania na tych samych danych przez wiele wątków bez stosowania synchronizacji są bezpieczne tylko wtedy, kiedy wątki jedynie czytają dane.

Jeśli chcesz korzystać z tego samego obiektu, szczególnie przez wartość, to musisz zadbać o blokady (muteksy - obiekty wzajemnego wykluczenia), które zapobiegną przed dostępem w tym samym czasie.

Prosty przykład:

#include <iostream>
#include <vector>
using namespace std;
vector<int> vec;

void zmien_wartosc() {
   for(size_t i = 0; i < 10; ++i)
      vec.push_back(i);
}

void odczytaj() {
   for(auto x : vec)
      cout << x << " ";
}

Jeśli chcesz, aby funkcja odczytaj() wykonała się dopiero wtedy, kiedy funkcja zmien_wartosc() zakończy swoje działanie, musisz zastosować blokadę. Możesz wykorzystać np. lock_guard lub unique_lock. W zależności od sytuacji, może być też konieczna blokada rekurencyjna. Do wykorzystania są również zmienne warunkowe, a także atomowe typy danych.

To tylko i wyłącznie zbiór pojęć. Nie byłbym w stanie w jednym poście wytłumaczyć nawet podstaw wielowątkowości i mechanizmów ich obsługi. Najlepszym rozwiązaniem będzie sięgniecie po materiały, jakie są dostępne na internecie i próba zrozumienia tych zagadnień.

PS. Musisz zadbać przy blokadach także o "fałszywe wybudzenia wątków".

komentarz 8 maja 2017 przez Blacha Mądrala (5,960 p.)
To akurat jest mi znane, zresztą napisałem że stosuje ów "blokady" danych. Bardziej w tym akapicie chodziło mi czy samo stosowanie jednego obiektu przez parę wątków może prowadzić do pewnych konfliktów i czy jest to np. odradzane. Oczywiste wydaje mi się że zmienne wewnątrz metody również mogą prowadzić do konfliktów. I czy tak duże pole do nieoczekiwanych działań powoduje że zwyczajnie nie powinno się tego robić.
0 głosów
odpowiedź 9 maja 2017 przez j23 Mędrzec (194,920 p.)

Jeśli chodzi o serwer (sieciowy), to IMO sockety w trybie nieblokującym plus pula wątków, do której wątek główny oddelegowuje obsługę zadań dla poszczególnych połączeń.

 

W takim projekcie wielowątkowość raczej jest nieunikniona.

Prosty serwer z obsługą wielu połączeń na raz można napisać w jednym wątku.

komentarz 9 maja 2017 przez Blacha Mądrala (5,960 p.)
Obecnie struktura jest taka że jeden wątek nasłuchuje i w razie odbioru przesłanie danych do obiektu "Buffor".

Ogólnie w planie jest stworzenie 3 wątki dzielące się dwoma obiektami "Buffor" gdzie jeden wątek dodaje kolejne dane do buforu gdzie kolejny wątek operuje na tych danych.

Podobne pytania

+2 głosów
1 odpowiedź 372 wizyt
0 głosów
3 odpowiedzi 326 wizyt
+1 głos
1 odpowiedź 1,333 wizyt
pytanie zadane 18 kwietnia 2015 w C# przez Dorion300 Szeryf (90,250 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...