C - Semafory i pamięć współdzielona, problem z wyświetleniem pobranych danych.

0

Witam,

Mam do napisania trzy oddzielne programy, dwa pełnią rolę producenta i odczytują tekst (po wyrazie) z dwóch oddzielnych plików i wysyłają do pamięci współdzielonej, z czego pierwszy wykonuje się trzy razy częściej niż drugi, oraz trzeci program pełniący rolę konsumenta, który odczytuje z pamięci współdzielonej przesłane słowa przez producentów i wyprowadza na ekran. Każdy program uruchamiam w oddzielnej konsoli a za pomocą semaforów zsynchronizowane jest ich działanie.

Wszystko działa poprawnie, do momentu kiedy zostaje do odczytania końcówka tekstu, jakieś ostatnie 50 wyrazów. Wtedy proces konsumenta (wyświetlający) się zawiesza. Dopiero po wywołaniu sygnału przerwania "ctrl + c" reszta tekstu zostaje wyświetlona na ekran. Zmniejszałem/zwiększałem długość tekstu dla producenta czytającego 3x więcej i niezależnie od tego, pod koniec zawsze następuje zawieszenie.

Chciałbym zapytać, co może powodować takie działanie programu? Semafory działają poprawnie ponieważ prawidłowo wyświetla mi 3 słowa z 1 pliku i później 1 słowo z drugiego i tak w kółko, aż nagle pod koniec się zatrzymuje.

Poniżej zamieszczam zdjęcie z uruchomienia programu. Widać tutaj, że dopiero po sygnale "^C" reszta tekstu pojawia się na ekranie a zawieszenie następuje w połowie wyświetlania wyrazu.

0

Alb utknąłeś na elementach synchronizacji (ew. oczekiwanie na producenta/konsumenta którego już nie ma), albo brak synchronizacji (opróżniania) strumienia wyjściowego na konsolę, albo...
W programowaniu wielowątkowym może być tyle albo że wydruk z konsoli bez dostępu do kodu nie pozwala diagnozować problemu.

0

ja bym obstawiał, że po prostu jeden wątek czeka na drugi i vice versa, ale bez kodu to ciężko powiedzieć. Wstaw sobie kilka printow debugowych, ktore beda Ci wyswietlaly co sie dzieje tam - kiedy jest brany semafor, a kiedy zwalniany itd

0

Problem już rozwiązałem. Szukałem rozwiązania w semaforach, a jednak było z nimi wszystko w porządku. Problem pojawia się, kiedy w procesie producenta np. wrzucam do pętli while(!feof(a)) warunek if...else..., przy kilku samych if'ach w środku też chyba problem wrócił, albo dałem while(1) na koniec, po wyjściu z tego pierwszego żeby mi zawiesił proces, jak skończę czytać z pliku. Ale kiedy zamiast !feof dałem 1 w pierwszej pętli i w środku zająłem się zakończeniem pliku na if'ach itp oraz drugiego while'a usunąłem, wszystko zaczęło działać.
Nie rozumiem w jaki sposób ilość lub rodzaj pętli wpływa na działanie procesu. Zauważyłem też, że np zwykły printf również ma problemy z przekazaniem danych na ekran. Dałem go np przed pętlą while(1) albo w ifie kończącym czytanie z pliku w tym while'u, to wyświetlił się dopiero po obsłużeniu SIGINT'a jak usunąłem shm i semafory.
Także wszystko działa, ale dlaczego wcześniej nie działało dalej jest to dla mnie tajemnicą. Jakby ktoś umiał to wyjaśnić to byłoby super ^^
A kodu wolałem nie wklejać, bo za dużo tego było, tym bardziej jak nie wiedziałem gdzie jest problem i musiałbym cały wkleić a wolałbym jednak nie ;P

0

To może kod pokażesz?

0

jesli chodzi o printfa, to to jest akurat raczej proste - zrobiles fflusha? System zwykle buforuje dane i w niektorych przypadkach trzeba zmusic go aby wydrukowal na ekran je w "tym" momencie.

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