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

Problem z"mutexami" Linux Programowanie C

Object Storage Arubacloud
0 głosów
136 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez Łukasz Michalski Użytkownik (560 p.)
edycja 11 stycznia 2018 przez Łukasz Michalski
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
char linia[100];
pthread_mutex_t muteks = PTHREAD_MUTEX_INITIALIZER;

int ile_lini(){
char linia[100];
int x=0;



FILE *plik = fopen("czytaj.c","r"); 

while(fgets(linia,100,plik)!=NULL){
	
	x=x+1;

};
    fclose(plik);
	return x;




}


void funkcja(int operator){
	int licznik=0,ilosc_lini;
	ilosc_lini=ile_lini();
	
	if(operator==1)
	{
FILE *plik = fopen("czytaj.c","r");  //Odczyt z pliku

while(licznik<ilosc_lini){
	pthread_mutex_lock(&muteks);
	
fgets(linia,100,plik);
printf("\nWyswietlam napis: %s",linia);
licznik=licznik+1;
sleep(1);

pthread_mutex_unlock(&muteks);
};
    fclose(plik);
}
	
	if(operator==2){
	
	while(licznik<ilosc_lini){	
	//pthread_mutex_lock(&muteks);
	
	FILE *plik2 = fopen("wynik1.txt","a");
	fputs(linia,plik2);
	fclose(plik2);
	licznik=licznik+1;
	sleep(1);
	
	//pthread_mutex_unlock(&muteks);
	}
	
	}
	

	
}


void *wywolanie(void *arg)
{int *tab = ((int *) arg);
	funkcja(tab[0]);
	
}

int main()
{
pthread_t w1,w2,w3;
int  zapis[1];
zapis[0]=2;
	pthread_attr_t  atrybut;
	pthread_attr_init(&atrybut);
	pthread_attr_setdetachstate(&atrybut, PTHREAD_CREATE_JOINABLE);


pthread_create(&w1, &atrybut, &wywolanie, &zapis); 
funkcja(1);
//pthread_create(&w1, NULL, &wywolanie, &zapis); 

return 0;
}

 

 

Wątek główny powinien odczytywać linie z pliku czytaj.c do bufora "linia", natomiast wątek dodatkowy powinien zapisywać zawartosc zmiennej "linia" do pliku wynik.txt, niestety program nie działa.
Czytałem już dziesiątki stron gdzie było napisane jak używać mutexów ale nie mam pojęcia dlaczego to nie działa.
Jeśli dodam lock i onlock w miejscu gdzie program zapisuje zmienna do pliku .txt do plik nawet nie zostanie utworzony. Jesli lock, i unlock wstawie tylko przy odczytywaniu pliku czytaj.c to do pliku .txt zapisze się kilkadziesiąt razy pierwsza linijka z pliku czytaj.c.
Już nie mam pojęcia co robię nie tak

komentarz 12 stycznia 2018 przez Łukasz Michalski Użytkownik (560 p.)
nie tutaj chciałem napisac

1 odpowiedź

+1 głos
odpowiedź 11 stycznia 2018 przez j23 Mędrzec (194,920 p.)
wybrane 12 stycznia 2018 przez Łukasz Michalski
 
Najlepsza

Synchronizujesz dostęp do linia, ale nie synchronizujesz samego procesu odczyt -> zapis. Jeden wątek czyta, jak leci, nawet nie czeka, aż ten drugi zapisze odczytaną linię. To samo drugi wątek - zapisuje bez sprawdzania, czy w linia coś w ogóle jest. Tu się aż prosi o zmienną warunkową (condition variable).

 

Na szybko tyle...

komentarz 12 stycznia 2018 przez Łukasz Michalski Użytkownik (560 p.)
Czy mógłbyś proszę powiedzieć coś więcej na ten temat?
W którym miejscu powinienem wstawić to lock, i unlock, żeby to zadziałało?
komentarz 12 stycznia 2018 przez Łukasz Michalski Użytkownik (560 p.)
Dzięki wielkie za twoją uwagę. Siedziałem nad tym od dwóch dni, i coraz bardziej się irytowałem bo wiedziałem, że to nie może być aż tak trudne.
Dzięki twojej wskazówce to rozgryzłem :)

Podobne pytania

0 głosów
0 odpowiedzi 181 wizyt
pytanie zadane 25 stycznia 2017 w C i C++ przez Smileandlove Nowicjusz (230 p.)
+1 głos
1 odpowiedź 331 wizyt
pytanie zadane 18 czerwca 2016 w C i C++ przez qwertz Użytkownik (850 p.)
0 głosów
0 odpowiedzi 644 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez Magda0700 Nowicjusz (120 p.)

92,550 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,935 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...