Wielowątkowość, a aplikacja klienta

0

Witam,
Piszę właśnie aplikację pełniącą rolę klienta. Jej zadanie polega na odebraniu danych z serwera i odpowiednim ich przetworzeniu. Myślałem, żeby zrobić tak, że jeden wątek zajmował by się odbieraniem danych, a drugi ich przetwarzaniem. Pomiędzy kolejka FIFO. Jednak teraz zastanawiam się, czy przez takie podejście coś zyskam?

Przetwarzanie danych jest dość czasochłonne, więc wyobrażałem sobie, że gdyby pojawiła się potrzeba odebrania nowej porcji informacji od serwera, w momencie gdy przetwarzane byłyby jeszcze poprzedni obiekt (dane od serwera mogą przyjść w przypadkowej chwili), to następowałaby przerwa na odebranie nowego obiektu, odłożenie go do bufora i powrót do przetwarzania, jednak teraz się zagłębiłem i widzę, że to nie tak działa.

Jakieś sugestie jak zrobić coś takiego?

0

Czy może jednak zyskałbym na takim podejściu w przypadku wykorzystania procesora wielordzeniowego (oba wątki wykonywałby się równolegle)?

0

Jeśli dane mogą nadejść niezależnie od stanu obliczeń klienta to jak najbardziej osobny wątek + FIFO. Sprawa się uprości, nie będziesz musiał wstrzymywać obliczeń. Odbieranie może być w trybie blokującym. Wystarczy prosta synchronizacja kolejki, którą można zrobić przy pomocy dwóch muteksów/sekcji krytycznych (nawijmy je muteks-kolejnka i muteks-odbiór):

Wątek odbierający:

  • przejmij muteks-odbiór
  • odbierz dane
  • przejmij muteks-kolejka
  • dołóż do kolejki porcję danych
  • zwolnij muteks-odbiór
  • zwolnij muteks-kolejka

Wątek obliczeń

  • przejmij muteks-kolejka
  • jeśli kolejka pusta:
    • zwolnij muteks-kolejka
    • przejmij muteks-odbiór
    • przejmij muteks-kolejka
    • zwolnij muteks-odbiór
  • ściągnij porcję danych z kolejki
  • zwolnij muteks-kolejka
  • rob obliczenia

Czy może jednak zyskałbym na takim podejściu w przypadku wykorzystania procesora wielordzeniowego (oba wątki wykonywałby się równolegle)?
Nie za wiele, gdyż odbiór danych nie jest czasochłonnym zadaniem. Już prędzej zastanów się nad rozbiciem obliczeń na różne wątki np. przydzielenie osobnego wątku każdej porcji danych która przyjdzie i/lub zrównoleglenie obliczeń na jednej porcji danych. Jeśli kolejka danych będzie zazwyczaj zapełniona to to pierwsze powinno wystarczyć, jeśli będzie zazwyczaj prawie pusta to obydwa, jeśli będzie zazwyczaj pusta to tylko to drugie.

0

Wielkie dzięki za odzew!

Nie bardzo rozumiem, co zyskuję poprzez wprowadzanie muteksa "odbiór" i jego przejmowanie i zwalnianie w wątku liczącym dane? Myślałem, żeby zastosować pthread_cond_t w przypadku, gdy wątek obliczający spotkałby się z pustą kolejką (oczekiwałby na pojawienie się jakiegoś elementu w kolejce).

Co do wprowadzenia wielu wątków, osobno dla każdej porcji obliczeń, to rzeczywiście wydaje się to warte uwagi.

0

Polecam artykuł na temat problemu producenta/konsumenta z wikipedii: http://en.wikipedia.org/wiki/Producer-consumer_problem

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