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

Jak programować aplikacje wielowątkowe?

0 głosów
386 wizyt
pytanie zadane 8 maja 2017 w C i C++ przez Blacha Mądrala (5,980 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,710 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,980 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 VIP (106,380 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,980 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ź 74 wizyt
0 głosów
3 odpowiedzi 155 wizyt
+1 głos
1 odpowiedź 535 wizyt
pytanie zadane 18 kwietnia 2015 w C# i .NET przez Dorion300 Szeryf (90,090 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

66,494 zapytań

113,266 odpowiedzi

239,865 komentarzy

46,630 pasjonatów

Przeglądających: 131
Pasjonatów: 0 Gości: 131

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...