• 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
72 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 (58,240 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ź 131 wizyt
pytanie zadane 14 listopada 2017 w Systemy operacyjne, programy przez Gucci Użytkownik (640 p.)
0 głosów
1 odpowiedź 107 wizyt
pytanie zadane 10 kwietnia w C i C++ przez Tomek Reda Użytkownik (740 p.)
0 głosów
1 odpowiedź 83 wizyt
pytanie zadane 21 marca w C i C++ przez Tomek Reda Użytkownik (740 p.)
Oferty pracy dla początkujących programistów na portalu No Fluff Jobs
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

49,784 zapytań

91,751 odpowiedzi

185,346 komentarzy

24,230 pasjonatów

Przeglądających: 238
Pasjonatów: 16 Gości: 222

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.

...