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

Synchronizacja wątków linux C

0 głosów
81 wizyt
pytanie zadane 12 stycznia w C i C++ przez Łukasz Michalski Początkujący (390 p.)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/syscall.h>
char linia[100];
pthread_mutex_t muteks = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t muteks2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t muteks3 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t muteks4 = PTHREAD_MUTEX_INITIALIZER;
//int       pthread_mutex_init(pthread_mutex_t       *muteks,        const
   //    pthread_mutexattr_t *mutexattr);

pthread_t w1,w2,w3;

long unsigned int tid;

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



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

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

};
    fclose(plik);
	return x;




}


void zapis_do_pliku(char nazwa[10])
{int licznik=0,ilosc_lini;
ilosc_lini=ile_lini();
while(licznik<ilosc_lini){	
	pthread_mutex_lock(&muteks2);
	FILE *plik2 = fopen(nazwa,"a");
	tid=syscall(SYS_gettid);
	//char id[10];
	//sprintf(id,"%lu",tid);
	//fputs(id,plik2);
	fputs(linia,plik2);
	printf("\nId: %lu Wyswietlam napis: %s",tid,linia);
	fclose(plik2);
	pthread_mutex_unlock(&muteks);
	licznik++;
//sleep(1);
	}
}

void *wywolanie_zapisu(void *arg)
{
int *tab = ((int *) arg); 
char *nazwa;
if(tab[0]==1)
{//printf("\nOtrzymalem jedynke");
nazwa="Wynik1.txt";}

if(tab[0]==2)
{//printf("\nOtrzymalem dwojke");
nazwa="Wynik2.txt";}


if(tab[0]==3)
{//printf("\nOtrzymalem trojke");
nazwa="Wynik3.txt";}

zapis_do_pliku(nazwa);
}



void odczyt_pliku()
{
int licznik=0,ilosc_lini;
			ilosc_lini=ile_lini();
FILE *plik = fopen("michalski_mutex.c","r");  //Odczyt z pliku

while(licznik<ilosc_lini){
usleep(500);
pthread_mutex_lock(&muteks);
pthread_mutex_lock(&muteks3);
fgets(linia,100,plik);
licznik=licznik+1;
pthread_mutex_unlock(&muteks2);
//usleep(50);
//pthread_mutex_unlock(&muteks2);
//usleep(50);
//pthread_mutex_unlock(&muteks2);
sleep(1);
};
    fclose(plik);



}




int main()
{
	remove("Wynik1.txt");
	remove("Wynik2.txt");
	remove("Wynik3.txt");
	int nazwa1[1],nazwa2[1],nazwa3[1];
	nazwa1[0]=1;
	nazwa2[0]=2;
	nazwa3[0]=3;
	int ilosc_lini;
	ilosc_lini=ile_lini();
	
	pthread_attr_t  atrybut;
	pthread_attr_init(&atrybut);
	pthread_attr_setdetachstate(&atrybut, PTHREAD_CREATE_JOINABLE);
	pthread_mutex_lock(&muteks2);
	pthread_create(&w1,&atrybut, &wywolanie_zapisu, &nazwa1);
	pthread_create(&w2,&atrybut, &wywolanie_zapisu, &nazwa2);
	pthread_create(&w3,&atrybut, &wywolanie_zapisu, &nazwa3);
	odczyt_pliku();
	
	
return 0;	
} //KONIEC

Aktualnie funkcja odczytu z pliku wykonuje się tyle samo razy co funkcja zapisu do pliku.

Chciałbym żeby funkcja zapisu wykonywała się trzy razy na jedno wykonanie funkcji odczytu. Czy da się to jakoś sensownie zrobić przy użyciu mutexów?

1 odpowiedź

0 głosów
odpowiedź 12 stycznia przez j23 Maniak (67,300 p.)
edycja 12 stycznia przez j23

Jeśli wszystkie wątki mają zapisywać tę samą linię, użyj zmiennej warunkowej i pthread_cond_broadcast() do sygnalizacji. Dla pewności można by dodać jakiś licznik, żeby wątek czytający poczekał, aż te trzy wątki zapiszą linie.

Podobne pytania

0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 14 listopada 2017 w Systemy operacyjne, programy przez Gucci Gaduła (3,060 p.)
0 głosów
1 odpowiedź 119 wizyt
pytanie zadane 10 kwietnia w C i C++ przez Tomek Reda Użytkownik (890 p.)
0 głosów
1 odpowiedź 93 wizyt
pytanie zadane 21 marca w C i C++ przez Tomek Reda Użytkownik (890 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

54,387 zapytań

98,251 odpowiedzi

202,070 komentarzy

26,700 pasjonatów

Przeglądających: 292
Pasjonatów: 8 Gości: 284

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.

...