• 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
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

54,387 zapytań

98,246 odpowiedzi

202,070 komentarzy

26,700 pasjonatów

Przeglądających: 254
Pasjonatów: 11 Gości: 243

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.

...